В настоящее время я работаю над навыком Alexa с использованием AWS Lambda, и все работает отлично, за исключением одной вещи. Кажется, я не могу успешно отправить 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 не отправляются в заголовках. Он отправляется в виде закодированной строки в теле. В своем коде вы должны правильно его кодировать, а затем отправить req.write()
, В nodejs есть пример кода POST документ для http.request()
.
Вот как вы можете изменить свой код, чтобы сделать это правильно:
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)
когда вы получите данные ответа. Я изменил свой ответ, чтобы показать это также.
Других решений пока нет …