一种无需太多工作即可轻松融入当前程序的解决方案是使用 npm 上的 form-data 模块。
表单数据模块简化了节点中的多部分请求。下面是一个简单的使用示例。
var http = require("https");
var FormData = require('form-data');
var fs = require('fs')
var form = new FormData();
form.append('my_field', fs.createReadStream('my_audio.file'));
var options = {
host: 'your.host',
port: 443,
method: 'POST',
// IMPORTANT!
headers: form.getHeaders()
}
var req = http.request(options, function (res) {
var chunks = [];
res.on("data", function (chunk) {
chunks.push(chunk);
});
res.on("end", function () {
var body = Buffer.concat(chunks);
console.log(body.toString());
});
});
// Pipe form to request
form.pipe(req);
在“真实世界”场景中,您可能希望进行更多的错误检查。此外,npm 上还有许多其他 http 客户端也使这个过程变得简单(请求模块使用 form-data BTW)。如果您有兴趣,请查看request 和got。
对于发送二进制请求,基本原理仍然相同,req 是 writable stream。因此,您可以将pipe 数据写入流,或直接使用req.write(data) 写入。这是一个例子。
var http = require('https');
var fs = require('fs');
var options = {
// ...
headers: {
'Content-Type': 'application/octet-stream'
}
}
var req = http.request(options, function (res) {
var chunks = [];
res.on("data", function (chunk) {
chunks.push(chunk);
});
res.on("end", function () {
var body = Buffer.concat(chunks);
console.log(body.toString());
});
});
var audioFile = fs.createReadStream('my_audio.file', { encoding: 'binary' });
audioFile.pipe(req);
请注意,如果您明确使用write 方法req.write(data),则必须调用req.end()。此外,您可能想查看 Node 的 Buffer (docs) 的编码选项。