我试图发送一个POST请求到一个API,请求中有一个图像。我正在使用请求模块进行此操作,但我尝试的所有操作都不起作用。我当前的代码:
const options = {
method: "POST",
url: "https://api.LINK.com/file",
port: 443,
headers: {
"Authorization": "Basic " + auth,
"Content-Type": "multipart/form-data"
},
form : {
"image" : fs.readFileSync("./images/scr1.png")
}
};
request(options, function (err, res, body) {
if(err) console.log(err);
console.log(body);
});
但是request由于某种原因使用了Content-Type: application/x-www-form-urlencoded
...我该如何修复这个问题呢?
4条答案
按热度按时间rsl1atfo1#
如文档表单中所述,
multipart/form-data
请求正在使用form-data
库。因此,您需要提供formData
选项,而不是form
选项。e3bfsja22#
烦恼的是几乎所有解决这个问题的示例都包含第三方模块。我知道简单地包含一个模块并复制/粘贴一个代码示例通常更容易,但对于像这样的基本HTTP概念来说,真的不需要这样的模块。添加模块会快速增加您在AWS lambda这样的云环境中的占用空间,在这种环境中,总的解决方案文件大小会严重影响运行时性能。我在这里找到了这个有用的示例,
https://tanaikech.github.io/2017/07/27/multipart-post-request-using-node.js/
希望对其他人有帮助!
lsmepo6l3#
由于
request
模块为deprecated,考虑使用form-data
(唯一依赖;处理丑陋低级细节(如计算唯一边界字符串)的小封装)和核心http(s)
模块。这有点冗长,但您可以得到较小的生产构建,这总是好的,在无服务器环境中更是如此,因为它可以减少冷启动时间。
更新,解决生产/lambda内部版本大小。使用
request
包的答案添加3.84mb的内存占用。此处使用的form-data
库为304kb。j9per5c44#
我想在没有外部依赖的typescript中构建一个工作示例。我仍然推荐above解决方案,但认为这可能对其他人有帮助。这里唯一的外部依赖是mime-types,用于设置内容类型头,但如果您事先知道要上传的内容类型,则可以删除此依赖,从而使解决方案完全没有依赖性。
实施:
示例脚本使用此: