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

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

这很糟糕,因为data没有设置为file_buffer。 我尝试打印file_buffer,它确实有内容(不是null、未定义,实际上里面有字节)。 所以对缓冲区进行字符串化会得到一个空字符串。
我尝试使用request模块做同样的事情,但也不起作用。
请注意,SignServer不是用Node或JavaScript编写的。它是一个Java应用程序,所以它可能不支持json(这就是为什么我试图使用querystring)。是的,我尝试发送json。

请查看此链接:https://nodejs.org/api/http.html#http_request_end_data_encoding_callback - Saulius Next
有趣的阅读:https://github.com/nodejs/node-v0.x-archive/issues/5827 - Ivan Rubinson
另一个有趣的阅读:https://github.com/tj/node-querystring/issues/45 - Ivan Rubinson
1
@IvanRubinson 我的猜测是你正尝试连接处理文件上传的服务器?如果是这样,那么该服务器将假定采用 multipart/form-data格式。通常不会使用 application/x-www-form-urlencoded格式发送文件,因为这种格式不太适合用于大(型)二进制数据。 - robertklep
@robertklep 这里有一个关于如何实现这个功能的新问题:https://dev59.com/RlcP5IYBdhLWcg3wvMdF - Ivan Rubinson
显示剩余3条评论
1个回答

5

为什么将data设置为空字符串在此问题中有所描述,解决方案在此问题中提供。

像这样转义和序列化缓冲区:

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

正如@robertklep所提到的,你的另一个问题是不能使用application/x-www-form-urlencoded发送大文件。你需要使用multipart/form-data

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接