如何在node.js中通过HTTP发送原始二进制数据?

时间:2019-05-29 00:12:44

标签: node.js http twitter

从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消息的其余部分不需要...

1 个答案:

答案 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