gpt4 book ai didi

javascript - 根据编码的formData值设置 Node 请求头

转载 作者:太空宇宙 更新时间:2023-11-04 02:18:34 24 4
gpt4 key购买 nike

我正在尝试使用 request npm 包将 HTTP POST 发送到需要特殊 header 的 API,该 header 由请求主体字符串表示形式的 Base64 编码 MD5 哈希组成。

生成 MD5 哈希值的代码:

function md5(val) {
val = val || '';
return crypto.createHash('md5').update(val).digest('base64');
}

当没有 formData 时,对于 GET 或 DELETE 请求,我应该使用的值是一个空字符串,这效果很好。 API 接受 header 并返回请求的数据。

不幸的是,当使用 formData 选项发布文件时,该对象由 request 模块进行编码。因此,当服务器将我的 MD5 哈希值与其端收到的正文进行比较时,它不匹配并引发错误。

我需要的简化请求:

var formData = {
left: 0,
top: 0,
width: 0,
height: 0,
profileImage: fs.readFileSync(__dirname + '/test_image.jpg')
};

var reqOptions = {
url: 'https://example.com/user/1234/profile-image',
method: 'POST,
json: true,
headers: {
'Content-MD5': md5(formData)
},
formData: formData
}

request(reqOptions, function(err, response, body) {
//process the response...
});

上面的示例将引发错误,因为 formData 变量是一个对象,而 crypto 模块需要一个字符串。我开始手动编写代码将 formData 对象转换为字符串,但是当 request 模块已经完成编码所有表单值的逻辑时,重写所有逻辑似乎有点荒谬。

我正在寻找一种可靠的方法来获取准确编码的表单内容,在request模块处理它们之后,但在请求实际发送之前,这样我就可以构建哈希值并添加 header 。

最佳答案

您可以使用以下方法手动执行此操作:

var crypto = require('crypto');
var FormData = require('form-data');

var form = new FormData();
form.append('left', 0);
form.append('top', 0);
form.append('width', 0);
form.append('height', 0);
form.append('profileImage', fs.readFileSync(__dirname + '/test_image.jpg'));

var rawChunks = [];
var hash = crypto.createHash('md5');
form.on('data', function(chunk) {
rawChunks.push(chunk);
hash.update(chunk);
}).on('end', function() {
var headers = form.getHeaders();
headers['Content-MD5'] = hash.digest('base64');
var req = request({
url: 'https://example.com/user/1234/profile-image',
method: 'POST',
headers: headers
}, function(err, res, body) {
// Do something with response
});
for (var i = 0; i < rawChunks.length; ++i)
req.write(rawChunks[i]);
req.end();
});

另一种可能的替代方案可能是使用分块编码并将 Content-MD5 作为 HTTP 预告片 header (出现在正文之后的 header )传递。这将允许您防止在内存中缓冲生成的表单数据(如果您决定将 fs.readFileSync() 更改为 fs.createReadStream(),甚至可能在内存中缓冲文件字段)。然而,这完全取决于目标服务器是否支持预告片 header (无论是解析它们还是实际对它们进行处理)。

关于javascript - 根据编码的formData值设置 Node 请求头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34601920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com