使用本机节点模块发送表单数据

时间:2018-10-04 19:47:18

标签: node.js http multipartform-data

对于我当前的项目,我必须将表单数据从我的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字符串中的键。我尝试了各种不同的组合,但似乎无法使它起作用。

2 个答案:

答案 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标头,也可以简单地忽略传输编码标头)。