我正在尝试使用 npm 包将 HTTP POST 发送request
到需要特殊标头的 API,该标头由请求正文的字符串表示的 base64 编码的 MD5 哈希组成。
生成 MD5 哈希的代码:
function md5(val) {
val = val || '';
return crypto.createHash('md5').update(val).digest('base64');
}
当没有 formData 时,对于 GET 或 DELETE 请求,我应该使用的值是一个空字符串,效果很好。API 接受标头并返回请求的数据。
不幸的是,当使用该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
模块处理之后,但在请求实际发送之前,所以我可以构建哈希值并添加标题。