Отправка данных через запрос POST с сервера node.js на сервер node.js

Я пытаюсь отправить данные через запрос POST с сервера node.js на другой сервер node.js. То, что я делаю в "клиенте" node.js, следующее:

var options = {
    host: 'my.url',
    port: 80,
    path: '/login',
    method: 'POST'
};

var req = http.request(options, function(res){
    console.log('status: ' + res.statusCode);
    console.log('headers: ' + JSON.stringify(res.headers));
    res.setEncoding('utf8');
    res.on('data', function(chunk){
        console.log("body: " + chunk);
    });
});

req.on('error', function(e) {
    console.log('problem with request: ' + e.message);
});

// write data to request body
req.write('data\n');
req.write('data\n');
req.end();

Этот фрагмент принимается более или менее с веб-сайта node.js, поэтому он должен быть правильным. Единственное, чего я не вижу, - это включить имя пользователя и пароль в переменную options для фактического входа в систему. Вот как я разбираюсь с данными на сервере node.js(я использую экспресс):

app.post('/login', function(req, res){
    var user = {};
    user.username = req.body.username;
    user.password = req.body.password;
        ...
});

Как я могу добавить эти теги username и password в переменную options, чтобы войти в нее?

Спасибо

Ответ 1

Публикация данных - это вопрос отправки строки запроса (точно так же, как вы отправляете ее с URL-адресом после ?) в качестве тела запроса.

Для этого требуются заголовки Content-Type и Content-Length, поэтому принимающий сервер знает, как интерпретировать входящие данные. (*)

var querystring = require('querystring');
var http = require('http');

var data = querystring.stringify({
      username: yourUsernameValue,
      password: yourPasswordValue
    });

var options = {
    host: 'my.url',
    port: 80,
    path: '/login',
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(data)
    }
};

var req = http.request(options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
        console.log("body: " + chunk);
    });
});

req.write(data);
req.end();

(*) Для отправки данных требуется, чтобы заголовок Content-Type устанавливался правильно, т.е. application/x-www-form-urlencoded для традиционного формата, который будет использовать стандартная HTML-форма.

Легко отправить JSON (application/json) точно так же; просто JSON.stringify() данные заранее.

Данные, кодированные по URL-адресу, поддерживают один уровень структуры (т.е. ключ и значение). JSON полезен, когда дело касается обмена данными с вложенной структурой.

В нижней строке: сервер должен иметь возможность интерпретировать рассматриваемый тип контента. Это может быть text/plain или что-то еще; нет необходимости конвертировать данные, если принимающий сервер понимает их как есть.

Добавьте параметр charset (например, application/json; charset=Windows-1252), если ваши данные находятся в необычном наборе символов, т.е. не UTF-8. Это может потребоваться, если вы прочтете его из файла, например.

Ответ 2

Вы также можете использовать Requestify, действительно классный и простой HTTP-клиент, который я написал для nodeJS +, он поддерживает кеширование.

Для выполнения запроса POST выполните следующие действия:

var requestify = require('requestify');

requestify.post('http://example.com', {
    hello: 'world'
})
.then(function(response) {
    // Get the response body (JSON parsed or jQuery object for XMLs)
    response.getBody();
});