无法将带有自定义标头的HTTP POST发送到外部服务器

时间:2017-03-11 15:41:42

标签: php node.js amazon-web-services aws-lambda alexa

我目前正致力于使用AWS Lambda的Alexa技能,除了一件事以外,所有技术都完美无缺。我似乎无法将HTTP param的/自定义标头成功发送到我的服务器。它可以完全抓取信息,但我无法弄清楚它为什么不发送参数/自定义标题。

我发送HTTP POST请求的代码如下所示:

MACS_peaks

我知道函数被正确调用,因为它可以完美地返回回调数据。

在我的php脚本中,我试图抓住这样的值:

function httpGetMall(latitude, longitude, callback) {

    var options = {
        host: 'myserver.com',
        path: '/path/to/script.php',
        auth: 'myAuthenticationPassword'.toString('base64'),
        method: 'POST', 
        headers: {'latitude': latitude.toString(), 'longitude': longitude.toString()}
    };

    var req = http.request(options, (res) => {

        var body = '';

        res.on('data', (d) => {
            body += d;
        });

        res.on('end', function () {
            callback(body);
        });

    });
    req.end();

    req.on('error', (e) => {

    });
}

我尝试在函数内手动设置纬度和经度,看看它们是否没有被传入,但是服务器仍然没有收到它们。

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

POST数据不会在标头中发送。它作为编码字符串发送到正文中。在您的代码中,您将对其进行正确编码,然后使用req.write()发送。 nodejs doc for http.request()中有一个POST代码示例。

以下是修改代码以正确执行此操作的方法:

var querystring = require('querystring');

function httpGetMall(latitude, longitude, callback) {

    var options = {
        host: 'myserver.com',
        path: '/path/to/script.php',
        auth: 'myAuthenticationPassword'.toString('base64'),
        method: 'POST', 
    };

    var req = http.request(options, (res) => {

        var body = '';

        res.on('data', (d) => {
            body += d;
        });

        res.on('end', function () {
            callback(null, body);
        });

    });

    req.on('error', (e) => {
        callback(e);
    });

    // format the data appropriately for the POST body
    var postData = querystring.stringify({latitude: latitude, longitude: longitude});
    // write the POST body
    req.write(postData);
    req.end();
}

注意:您还需要添加正确的错误处理。您可能应该将回调转换为典型的nodejs异步回调,它将错误作为第一个参数,将数据作为第二个参数。然后,您可以在收到错误时调用callback(err),并在获得响应数据时调用callback(null, body)。我已经修改了我的答案以表明这一点。