【问题标题】:Can't send HTTP POST with custom headers to external server无法将带有自定义标头的 HTTP POST 发送到外部服务器
【发布时间】:2017-08-01 21:41:50
【问题描述】:

我目前正在使用 AWS Lambda 研究 Alexa 技能,除了一件事之外,所有的一切都运行良好。我似乎无法成功地将 HTTP 参数/自定义标头发布到我的服务器。它可以完美抓取信息,但我不知道为什么它不发送参数/自定义标头。

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

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) => {

    });
}

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

在我的 php 脚本中,我试图像这样获取值:

$latitude = $_POST['latitude'];
$longitude = $_POST['longitude'];

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

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 您是否意识到 POST 数据不是在标头中发送的。它作为正文中的编码字符串发送。这可能是您的 PHP 期望找到它的地方,但是在 node.js 中创建 POST 请求时,您没有将数据放在正确的位置。
  • @jfriend00 哦,我没有意识到这一点。我如何将数据作为正文中的编码字符串发送?我是 NodeJS 和网络的新手,如果我的术语不正确,请见谅。
  • 我已经在答案中向您展示了如何做到这一点。
  • @jfriend00 我正确地修改了我的代码,但是每当尝试对查询字符串执行任何操作时都会出错。我是否必须上传一个库或类似的东西才能识别查询字符串?还是应该自动识别?
  • 请看我的回答。它向您显示querystring 的来源。代码在我的答案中。

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


【解决方案1】:

POST 数据不在标头中发送。它作为正文中的编码字符串发送。在您的代码中,您将对其进行正确编码,然后使用req.write() 发送它。在nodejsdoc 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)。我已经修改了我的答案以显示这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-24
    • 2011-09-13
    • 2011-02-21
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    相关资源
    最近更新 更多