【发布时间】:2016-01-04 23:47:41
【问题描述】:
我正在尝试使用request npm 包向需要特殊标头的 API 发送 HTTP POST,该标头由请求正文的字符串表示形式的 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 模块已经完成编码所有表单值的所有逻辑时,重写所有逻辑似乎有点荒谬。
我正在寻找一种可靠的方法来获取 exact 编码的表单内容,在 request 模块处理它们之后,但在实际发送请求之前,所以我可以构建哈希值并添加标头。
【问题讨论】:
-
您是否尝试过将其编码为
Buffer并使用request发送缓冲区?这样您就可以实际将请求正文提取为字符串
标签: javascript node.js encoding http-headers npm-request