【问题标题】:How do I send a buffer in an HTTP request?如何在 HTTP 请求中发送缓冲区?
【发布时间】:2017-05-11 18:08:31
【问题描述】:

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

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

我尝试用 request 模块做同样的事情,但它也没有工作。

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

【问题讨论】:

  • 请检查:nodejs.org/api/…
  • @SauliusNext - 好的,这就是我发送二进制数据的方式。但我需要发送两件东西——一件是字符串,另一件是二进制文件,我需要给它们起名字,以便 API 能够区分它们。
  • @IvanRubinson 我的猜测是您尝试联系的服务器处理文件上传?如果是这样,它将假设multipart/form-data。文件通常不使用application/x-www-form-urlencoded 发送,因为它并不适合大型(ish)二进制数据。

标签: node.js http


【解决方案1】:

this issue中描述了data设置为空字符串的原因,this issue中给出了解决方案。

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

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

正如@robertklep 提到的,您的另一个问题是您无法使用application/x-www-form-urlencoded 发送大文件。您需要使用 multipart/form-data 来完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多