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

时间:2017-05-11 09:05:41

标签: node.js http

我在内存中有一个文件(缓冲区) - 文件系统上没有文件。 我想将该缓冲区发送到另一个与HTTP协商的服务器。

例如,某些API A 在内存中创建文件,SignServer处理此类文件,并使用新缓冲区进行响应。我的API从 A 获取文件并将其提供给SignServer。

我尝试以多种方式将文件发送到SignServer,但它继续响应状态400(请求中缺少字段'data')。

我尝试了什么:

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,它确实有内容(不是null,不是未定义,实际上有内部字节)。 因此,对缓冲区进行字符串化会产生一个空字符串。

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

请注意,SignServer不是用Node编写的,也不是用JavaScript编写的。它是一个Java应用程序,所以它可能不适用于json(这就是为什么我要尝试使用querystring)。是的,我试过发送json。

1 个答案:

答案 0 :(得分:2)

this issue中描述了将var data = querystring.stringify({ workerName: 'PDFSigner', data: escape(file_buffer).toString('binary') }); 设置为空字符串的原因,解决方案在this issue中提供。

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

application/x-www-form-urlencoded

正如@robertklep所提到的,您的另一个问题是您无法使用multipart/form-data发送大文件。您需要使用ng-model="tableValues[row][column]"