Как отправить буфер в HTTP-запросе?
У меня есть файл в памяти (буфер) - в файловой системе нет файла. Я хочу отправить этот буфер на другой сервер, который говорит HTTP.
Например, некоторый API A создает файл в памяти, SignServer манипулирует такими файлами и отвечает новым буфером. Мой API берет файл из A и передает его в SignServer.
Я попытался отправить файл в SignServer несколькими способами, но он продолжает отвечать со статусом 400 (в запросе отсутствует поле "данные").
Что я пробовал:
var http = require('http');
var querystring = require('querystring');
var data = querystring.stringify({
workerName: 'PDFSigner',
data: file_buffer
});
var request = new http.ClientRequest({
hostname: 'localhost',
port: 8080,
path: '/signserver/process',
method: 'GET',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
// I also tried 'multipart/form-data'
'Content-Length': Buffer.byteLength(data)
}
});
request.end(data);
Я пробовал печатать data
и это показало:
workerName = PDFSigner & данные =
Что плохо, потому что data
не был установлен в file_buffer
, Я пробовал печатать file_buffer
и у него есть содержимое (не нулевое, не неопределенное, внутри фактически есть байты). Так что строковое расположение буфера дало пустую строку.
Я пытался сделать то же самое с модулем запроса, и он тоже не работал.
Обратите внимание, что SignServer не написан ни в Node, ни в JavaScript. Это Java-приложение, поэтому оно, вероятно, не работает с json (вот почему я пытаюсь сделать это с querystring
). Да, я пытался отправить JSON.
1 ответ
Причина по которой data
устанавливается в пустую строку, описанную в этой проблеме, и решение дано в этой проблеме.
экранируйте и зашифруйте буфер следующим образом:
var data = querystring.stringify({
workerName: 'PDFSigner',
data: escape(file_buffer).toString('binary')
});
Как уже упоминалось @robertklep, ваша другая проблема в том, что вы не можете отправить большой файл, используя application/x-www-form-urlencoded
, Вам нужно сделать это с multipart/form-data
,