从node.js后端,我需要将HTTP消息发送到REST端点。端点需要一些期望在HTTP消息中找到的参数。其中一些参数非常简单,只需要一个数字或一个字符串作为参数即可。但是其中一个参数是“正在上传的原始二进制文件内容”,这让我感到困惑。据我了解,这些参数需要一起收集到一个字符串中,以放入HTTP请求的正文中。如何将原始二进制数据添加到字符串?显然,它不能包含在字符串中,而是原始的二进制数据。需要将其编码为字符。
有问题的端点是Twitter media upload API。 “原始二进制数据”参数称为media
。下面是一个不完整的代码片段,显示了我尝试过的基本内容。具体来说,就是我构建requestBody
字符串的行。我不认为这几乎是正确的,因为端点正在返回“错误请求”消息。
var https = require("https");
var base64ImageData = /* (some base 64 string here) */;
var options = {
host: "api.twitter.com",
path: "/1.1/media/upload.json",
method: "POST",
headers: {
"Content-Type": "multipart/form-data"
}
};
var request = https.request(options, function(response) {});
var requestBody = "media_id=18283918294&media=" + Buffer.from(base64ImageData, "base64").toString("binary");
request.write(requestBody);
request.end();
同样值得注意的是,Twitter本身也注意到以下极其令人困惑的声明:
“发布base64编码的图像时,请确保在邮件的图像部分上设置“ Content-Transfer-Encoding:base64” 。”
来源:https://developer.twitter.com/en/docs/media/upload-media/uploading-media/media-best-practices
这可能是我的问题的答案的一部分,但是我不明白的是:如何将不同的标头应用于HTTP消息的不同部分?因为图像数据显然是需要具有“ base64”的Content-Transfer-Encoding标头,而HTTP消息的其余部分不需要...
答案 0 :(得分:2)
如何将不同的标头应用于HTTP消息的不同部分?
这是multipart/form-data
内容类型的重点。多部分消息如下所示:
Content-Type: multipart/form-data; boundary=---foo---
---foo---
Content-Disposition: form-data; name="datafile1"; filename="r.gif"
Content-Transfer-Encoding: base64
Content-Type: image/gif
// data goes here
---foo---
Content-Disposition: form-data; name="datafile2"; filename="g.png"
Content-Transfer-Encoding: base64
Content-Type: image/png
// another file's data goes here
---foo---
您可能不想自己将所有这些放在一起。有很多很好的库可以将复杂的POST放在一起。例如:https://www.npmjs.com/package/form-data