2017-03-11 62 views
0

我目前正在使用AWS Lambda进行Alexa技能工作,除了一件事情以外,所有工作都很完美。我似乎无法成功POST HTTP参数/自定义标头到我的服务器。它可以抓取信息完美,但我不明白为什么它不发送参数/自定义标题。无法使用自定义标头将HTTP POST发送到外部服务器

我对发送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']; 

我已经手动尝试设置函数内部的纬度和经度,看看他们并没有获得通过的,但服务器仍然没有收到它们。

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

+2

您是否意识到POST数据未在标头中发送。它作为身体中的编码字符串发送。这可能是PHP希望找到它的地方,但是您在node.js中创建POST请求时并未将数据放在正确的位置。 – jfriend00

+0

@ jfriend00哦,我没有意识到这一点。我如何将数据作为身体中的编码字符串发送?我是NodeJS和网络的新手,很抱歉,如果我的术语不正确。 –

+0

我已经向你展示了如何在答案中做到这一点。 – jfriend00

回答

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)中调用callback(null, body)。我修改了我的答案以显示这一点。

相关问题