如何在 HTTP 请求中发送缓冲区?

Iva*_*son 4 http node.js

我在内存(缓冲区)中有一个文件 - 文件系统上没有文件。我想将该缓冲区发送到另一个使用 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);
Run Code Online (Sandbox Code Playgroud)

我尝试打印data,结果显示:

工人名称=PDFSigner&data=

这很糟糕,因为data没有设置为file_buffer. 我尝试 print file_buffer,它确实有内容(不为空,不为未定义,实际上里面有字节)。因此,对缓冲区进行字符串化会得到一个空字符串。

我尝试对请求模块执行相同的操作,但它也不起作用。

请注意,SignServer 不是用 Node 或 JavaScript 编写的。它是一个 Java 应用程序,因此它可能不适用于 json (这就是我尝试使用 json 的原因querystring)。是的,我尝试发送 json。

Iva*_*son 5

data设置为空字符串的原因本期有描述,解决方案也本期给出。

像这样对缓冲区进行转义和字符串化:

var data = querystring.stringify({
    workerName: 'PDFSigner',
    data: escape(file_buffer).toString('binary')
});
Run Code Online (Sandbox Code Playgroud)

正如 @robertklep 提到的,您的另一个问题是您无法使用application/x-www-form-urlencoded. 你需要用 来做到这一点multipart/form-data