对于我当前的项目,我必须将表单数据从我的lambda函数发送到api端点。 api端点本质上期望两个图像(它们相互比较)和一个密钥。如前所述,我似乎无法以某种方式将正确的表单数据发送到api端点。我检查了邮递员,它似乎工作正常,但是某些功能似乎无法正常工作。我认为它必须与我发送的表单数据字符串相关。在下面,您可以找到该函数的简化版本(我排除了两个图像文件),但是由于某种原因,我收到一条错误消息,告诉我api无法读取key属性:
const http = require('http');
const https = require('https');
const httpPromise = (protocol, params, postData) => {
return new Promise((resolve, reject) => {
const requestModule = protocol === 'http' ? http : https;
const req = requestModule.request(params, res => {
// grab request status
const statusCode = res.statusCode;
if(statusCode < 200 || statusCode > 299) {
throw new Error('Request Failed with Status Code:', statusCode);
}
let body = '';
// continuosly update data with incoming data
res.setEncoding('utf8');
res.on('data', data => body += data);
// once all data was received
res.on('end', () => resolve(body));
})
// write data to a post request
if(typeof(params.method) === 'string' && params.method === 'POST' && postData) {
req.write(postData)
}
// bind to the error event
req.on('error', err => reject(err));
// end the request
req.end();
})
}
const controller = async () => {
const apiKey = "00000000";
const options = {
hostname: '***"
port: 80,
path: '***'
method: 'POST',
headers: {"content-type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"}
}
const postData = "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"key\"\r\n\r\00000000\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--"
let result = await httpPromise('http', options, postData)
console.log(result);
}
是的,因此似乎无法识别postData
字符串中的键。我尝试了各种不同的组合,但似乎无法使它起作用。
答案 0 :(得分:1)
默认的http和https库有点冗长和烦人。
建议改用 request 库。了解更多here
在这种情况下,要发出请求,只需将其写为:
var request = require('request');
var formData = {
// Pass a simple key-value pair
my_field: 'my_value',
}
request.post({url:'http://service.com/upload', formData: formData}, (err, response, body) => {
// Handle response here
});
答案 1 :(得分:0)
好吧,所以对于可能也会遇到相同问题的任何人,我花了一点时间但却弄清楚了问题所在。我没有设置Content-Length标头,这反过来又意味着该节点自动添加了Transfer-Encoding标头并将其值设置为块。这破坏了接收API,并导致了问题。将Content-Length标头设置为正确的长度,并将Transfer-Encoding标头设置为空字符串,在这里解决了我的问题(但我认为,一旦定义了Content-Length标头,也可以简单地忽略传输编码标头)。