Как отправить запрос, используя node.js - PullRequest
31 голосов
/ 22 декабря 2010

Я пытаюсь опубликовать JSON на URL. Я видел различные другие вопросы по этому поводу в stackoverflow, но ни один из них, казалось, не был ясен или работал. Вот как далеко я добрался, я изменил пример на api docs:

var http = require('http');
var google = http.createClient(80, 'server');
var request = google.request('POST', '/get_stuff',
  {'host': 'sever',  'content-type': 'application/json'});
request.write(JSON.stringify(some_json),encoding='utf8'); //possibly need to escape as well? 
request.end();
request.on('response', function (response) {
  console.log('STATUS: ' + response.statusCode);
  console.log('HEADERS: ' + JSON.stringify(response.headers));
  response.setEncoding('utf8');
  response.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

Когда я отправляю это на сервер, я получаю сообщение об ошибке, говорящее мне, что это не формат json или что это не utf8, как должно быть. Я пытался вытащить URL-адрес запроса, но он пуст. Я только начинаю с nodejs, поэтому, пожалуйста, будьте добры.

Ответы [ 8 ]

39 голосов
/ 16 июня 2012

Проблема в том, что вы устанавливаете Content-Type не в том месте.Он является частью заголовков запроса, которые имеют свой собственный ключ в объекте параметров, первый параметр метода request ().Вот реализация, использующая ClientRequest () для одноразовой транзакции (вы можете сохранить createClient (), если вам нужно сделать несколько соединений с одним сервером):

var http = require('http')

var body = JSON.stringify({
    foo: "bar"
})

var request = new http.ClientRequest({
    hostname: "SERVER_NAME",
    port: 80,
    path: "/get_stuff",
    method: "POST",
    headers: {
        "Content-Type": "application/json",
        "Content-Length": Buffer.byteLength(body)
    }
})

request.end(body)

Остальная часть кода в вопросеправильно (request.on () и ниже).

14 голосов
/ 21 сентября 2012

Джамм понял это правильно.Если заголовок Content-Length не установлен, то тело будет содержать некоторую длину в начале и 0 в конце.

Поэтому, когда я отправлял с узла:

{"email":"joe@bloggs.com","passwd":"123456"}

мой сервер rails получал:

"2b {"email":"joe@bloggs.com","passwd":"123456"} 0  "

Rails не понимал 2b, поэтому он не будет интерпретировать результаты.

Итак, для передачи параметров через JSON установитеContent-Type для application / json и всегда указывайте Content-Length.

9 голосов
/ 10 июня 2014

Чтобы отправить JSON в виде POST на внешний API с NodeJS ... (и модулем "http")

var http = require('http');

var post_req  = null,
    post_data = '{"login":"toto","password":"okay","duration":"9999"}';

var post_options = {
    hostname: '192.168.1.1',
    port    : '8080',
    path    : '/web/authenticate',
    method  : 'POST',
    headers : {
        'Content-Type': 'application/json',
        'Cache-Control': 'no-cache',
        'Content-Length': post_data.length
    }
};

post_req = http.request(post_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('Response: ', chunk);
    });
});

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

post_req.write(post_data);
post_req.end();
6 голосов
/ 09 февраля 2014

Существует очень хорошая библиотека, которая поддерживает отправку запроса POST в Nodejs:

Ссылка: https://github.com/mikeal/request

Пример кода:

var request = require('request');

//test data
var USER_DATA = {
    "email": "email@mail.com",
    "password": "a075d17f3d453073853f813838c15b8023b8c487038436354fe599c3942e1f95"
}

var options = {
    method: 'POST',
    url: 'URL:PORT/PATH',
    headers: {
        'Content-Type': 'application/json'
    },
    json: USER_DATA

};


function callback(error, response, body) {
    if (!error) {
        var info = JSON.parse(JSON.stringify(body));
        console.log(info);
    }
    else {
        console.log('Error happened: '+ error);
    }
}

//send request
request(options, callback);
4 голосов
/ 23 декабря 2010

Попробуйте включить длину контента.

var body = JSON.stringify(some_json);
var request = google.request('POST', '/get_stuff', { 
    host: 'server',
    'Content-Length': Buffer.byteLength(body),
    'Content-Type': 'application/json' 
    });
request.write(body);
request.end();
3 голосов
/ 22 декабря 2010

Это может не решить вашу проблему, но javascript не поддерживает именованные аргументы, поэтому, где вы говорите:

request.write(JSON.stringify(some_json),encoding='utf8');

Вы должны сказать:

request.write(JSON.stringify(some_json),'utf8');

Кодировка =присваивает глобальную переменную, поэтому он имеет правильный синтаксис, но, вероятно, не выполняет то, что вы намеревались.

2 голосов
/ 30 октября 2013

Вероятно, в тот момент, когда задавался этот вопрос, его не существовало. В настоящее время вы можете использовать библиотеку более высокого уровня для обработки запросов http, например, https://github.com/mikeal/request. Встроенный модуль http узла слишком низок для начинающихс.

Модуль запросов Mikeal имеет встроенную поддержку для прямой обработки JSON (см. документацию, особенно https://github.com/mikeal/request#requestoptions-callback).

1 голос
/ 23 марта 2012
var request = google.request(
  'POST',
  '/get_stuff',
  {
    'host': 'sever',
    **'headers'**:
    {
      'content-type': 'application/json'
    }
  }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...