Не удается отправить HTTP POST с пользовательскими заголовками на внешний сервер

В настоящее время я работаю над навыком 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'];

Я попытался вручную установить широту и долготу внутри функции, чтобы убедиться, что они не были переданы, но сервер так и не получил их.

Любая помощь будет принята с благодарностью. Спасибо!

0

Решение

Данные 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) когда вы получите данные ответа. Я изменил свой ответ, чтобы показать это также.

1

Другие решения

Других решений пока нет …

А ты уже прошел курс программирования? Супер скидка!
Прокачать скилл $$$
×