Как отправить необработанные двоичные данные через HTTP в node.js? - PullRequest
0 голосов
/ 29 мая 2019

Из внутреннего узла node.js мне нужно отправить HTTP-сообщение конечной точке REST.Конечной точке требуются некоторые параметры, которые она ожидает найти в HTTP-сообщении.Некоторые из параметров достаточно просты, просто требуют числа или строки в качестве аргумента.Но один из параметров должен быть «загружаемым необработанным содержимым двоичного файла», и это озадачило меня.Насколько я понимаю, параметры должны быть собраны в строку для помещения в тело HTTP-запроса;Как добавить необработанные двоичные данные в строку?Очевидно, что для того, чтобы он был в строке, он не может быть необработанными двоичными данными;он должен быть закодирован в символы.

Конечной точкой является API загрузки медиафайлов Twitter .Параметр «необработанные двоичные данные» называется 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-сообщения? Поскольку, очевидно, данные изображениядолжен иметь заголовок Content-Transfer-Encoding "base64", в то время как остальная часть HTTP-сообщения не ...

1 Ответ

2 голосов
/ 29 мая 2019

Как применить разные заголовки к разным частям 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...