如何在HTTP POST请求的正文中发送'ogg'文件?
我正在开发一个nodejs项目,需要通过向API发出请求来获取响应,我需要在请求体中发送音频文件(audio.ogg)。在“邮差”中,我们可以通过从本地选择文件并发出请求来执行此类操作。
如何使用像'request'这样的npm包对我的Nodejs应用程序做同样的事情?
到目前为止我的代码在这里引用:
var request = require('request');
var fs = require('fs');
var path = require('path');
router.get('/', function(req, res, next) {
var options = {
method: 'post',
body: {
'language': "<language>",
'audio_file':path.join(__dirname, 'audio.ogg')
}, // Javascript object
json: true,
url: "<API>",
headers: {
'Authorization': "<token>",
'ContentType': "application/x-www-form-urlencoded"
}
}
request(options, function (err, res, body) {
if (err) {
console.log('Error :', err)
return
}
console.log(' Body :', body)
});
// res.render('index', { title: 'Express' });
});
回答如下:
在options.headers
中,由于您要发送二进制数据,因此您的ContentType应为“multipart / form-data”而不是“application / x-www-form-urlencoded”,因为二进制数据被指出使用x-www-form-urlencoded
进行传输效率低(请参阅this SO answer)有关原因的详细信息)。
幸运的是,您已经使用的request
库包括用于处理form-data
请求的multipart/form-data
库。 request
为此提供了formData
选项,您可以使用它而不是使用body
选项。
您更新的选项对象可能如下所示:
var formData = {
// Pass a simple key-value pair
language: '<language>',
// Pass data via Streams
my_file: fs.createReadStream(__dirname + '/audio.ogg')
};
var options = {
method: 'post',
formData: formData,
url: "<API>",
headers: {
'Authorization': "<token>",
'ContentType': "multipart/form-data"
}
}
有关更多信息,请查看request
here的文档