Как выполняется HTTP-запрос POST в node.js? - PullRequest
872 голосов
/ 28 мая 2011

Как я могу сделать исходящий HTTP-запрос POST с данными в node.js?

Ответы [ 19 ]

1063 голосов
/ 21 октября 2012

Это становится намного проще, если вы используете библиотеку request .

var request = require('request');

request.post(
    'http://www.yoursite.com/formpage',
    { json: { key: 'value' } },
    function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body);
        }
    }
);

Помимо обеспечения хорошего синтаксиса, он упрощает запросы json, обрабатывает подписи oauth (для твиттера и т. Д.), Может создавать многоэлементные формы (например, для загрузки файлов) и потоковую передачу.

Для установки запроса используйте команду npm install request

799 голосов
/ 28 мая 2011

Вот пример использования node.js для выполнения запроса POST к API компилятора Google:

// We need this to build our post string
var querystring = require('querystring');
var http = require('http');
var fs = require('fs');

function PostCode(codestring) {
  // Build the post string from an object
  var post_data = querystring.stringify({
      'compilation_level' : 'ADVANCED_OPTIMIZATIONS',
      'output_format': 'json',
      'output_info': 'compiled_code',
        'warning_level' : 'QUIET',
        'js_code' : codestring
  });

  // An object of options to indicate where to post to
  var post_options = {
      host: 'closure-compiler.appspot.com',
      port: '80',
      path: '/compile',
      method: 'POST',
      headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
          'Content-Length': Buffer.byteLength(post_data)
      }
  };

  // Set up the request
  var post_req = http.request(post_options, function(res) {
      res.setEncoding('utf8');
      res.on('data', function (chunk) {
          console.log('Response: ' + chunk);
      });
  });

  // post the data
  post_req.write(post_data);
  post_req.end();

}

// This is an async file read
fs.readFile('LinkedList.js', 'utf-8', function (err, data) {
  if (err) {
    // If this were just a small part of the application, you would
    // want to handle this differently, maybe throwing an exception
    // for the caller to handle. Since the file is absolutely essential
    // to the program's functionality, we're going to exit with a fatal
    // error instead.
    console.log("FATAL An error occurred trying to read in the file: " + err);
    process.exit(-2);
  }
  // Make sure there's data before we post it
  if(data) {
    PostCode(data);
  }
  else {
    console.log("No data to post");
    process.exit(-1);
  }
});

Я обновил код, чтобы показать, как публиковать данные из файла, вместо жестко закодированной строки. Для этого он использует команду async fs.readFile, публикуя реальный код после успешного чтения. Если есть ошибка, она генерируется, и если нет данных, процесс завершается с отрицательным значением, указывающим на ошибку.

128 голосов
/ 03 февраля 2015

Вы можете использовать библиотеку запросов. https://www.npmjs.com/package/request

var request = require('request');

Чтобы опубликовать данные в формате JSON:

var myJSONObject = { ... };
request({
    url: "http://josiahchoi.com/myjson",
    method: "POST",
    json: true,   // <--Very important!!!
    body: myJSONObject
}, function (error, response, body){
    console.log(response);
});

Чтобы опубликовать данные XML:

var myXMLText = '<xml>...........</xml>'
request({
    url: "http://josiahchoi.com/myjson",
    method: "POST",
    headers: {
        "content-type": "application/xml",  // <--Very important!!!
    },
    body: myXMLText
}, function (error, response, body){
    console.log(response);
});
39 голосов
/ 08 марта 2013

Я использую Рестлер и Игла для производственных целей.Они оба гораздо более мощные, чем родной httprequest.Можно запрашивать с обычной аутентификацией, специальным вводом заголовка или даже загружать / скачивать файлы.

Что касается операции post / get, их также намного проще использовать, чем необработанные вызовы ajax с использованием httprequest.

needle.post('https://my.app.com/endpoint', {foo:'bar'}, 
    function(err, resp, body){
        console.log(body);
});
22 голосов
/ 16 июня 2018

Просто и без зависимостей. Использует обещание, чтобы вы могли дождаться результата. Возвращает тело ответа и не проверяет код состояния ответа.

const https = require('https');

function httpsPost({body, ...options}) {
    return new Promise((resolve,reject) => {
        const req = https.request({
            method: 'POST',
            ...options,
        }, res => {
            const chunks = [];
            res.on('data', data => chunks.push(data))
            res.on('end', () => {
                let body = Buffer.concat(chunks);
                switch(res.headers['content-type']) {
                    case 'application/json':
                        body = JSON.parse(body);
                        break;
                }
                resolve(body)
            })
        })
        req.on('error',reject);
        if(body) {
            req.write(body);
        }
        req.end();
    })
}

Использование:

const res = await httpsPost({
    hostname: 'sentry.io',
    path: `/api/0/organizations/org/releases/${changesetId}/deploys/`,
    headers: {
        'Authorization': `Bearer ${process.env.SENTRY_AUTH_TOKEN}`,
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        environment: isLive ? 'production' : 'demo',
    })
})
19 голосов
/ 18 июля 2013

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

Просто выполните следующее:

    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();
    });
17 голосов
/ 12 мая 2015

Для тех, кто придет сюда в последующие годы.В настоящее время существует множество различных библиотек, которые могут выполнить это с минимальным кодированием.Я очень предпочитаю элегантные легковесные библиотеки для HTTP-запросов, если вам абсолютно не нужен контроль над HTTP-компонентами низкого уровня.

Одна такая библиотека Unirest

Для ее установки используйтеnpm.
$ npm install unirest

И на примере Hello, World!, к которому все привыкли.

var unirest = require('unirest');

unirest.post('http://example.com/helloworld')
.header('Accept', 'application/json')
.send({ "Hello": "World!" })
.end(function (response) {
  console.log(response.body);
});


Дополнительно:
Многолюдей также предлагают использовать request [2]

Стоит отметить, что за кадром Unirest используется библиотека request.

Unirest предоставляет методы для прямого доступа к объекту запроса.

Пример:

var Request = unirest.get('http://mockbin.com/request');
14 голосов
/ 11 января 2016

Это самый простой способ, которым я пользуюсь для запроса: с помощью модуля «запрос».

Команда для установки модуля запроса:

$ npm install request

Пример кода:

var request = require('request')

var options = {
  method: 'post',
  body: postData, // Javascript object
  json: true, // Use,If you are sending JSON data
  url: url,
  headers: {
    // Specify headers, If any
  }
}

request(options, function (err, res, body) {
  if (err) {
    console.log('Error :', err)
    return
  }
  console.log(' Body :', body)

});

Вы также можете использовать встроенный модуль Node.js 'http' для отправки запроса.

12 голосов
/ 11 марта 2017
var https = require('https');


/**
 * HOW TO Make an HTTP Call - POST
 */
// do a POST request
// create the JSON object
jsonObject = JSON.stringify({
    "message" : "The web of things is approaching, let do some tests to be ready!",
    "name" : "Test message posted with node.js",
    "caption" : "Some tests with node.js",
    "link" : "http://www.youscada.com",
    "description" : "this is a description",
    "picture" : "http://youscada.com/wp-content/uploads/2012/05/logo2.png",
    "actions" : [ {
        "name" : "youSCADA",
        "link" : "http://www.youscada.com"
    } ]
});

// prepare the header
var postheaders = {
    'Content-Type' : 'application/json',
    'Content-Length' : Buffer.byteLength(jsonObject, 'utf8')
};

// the post options
var optionspost = {
    host : 'graph.facebook.com',
    port : 443,
    path : '/youscada/feed?access_token=your_api_key',
    method : 'POST',
    headers : postheaders
};

console.info('Options prepared:');
console.info(optionspost);
console.info('Do the POST call');

// do the POST call
var reqPost = https.request(optionspost, function(res) {
    console.log("statusCode: ", res.statusCode);
    // uncomment it for header details
//  console.log("headers: ", res.headers);

    res.on('data', function(d) {
        console.info('POST result:\n');
        process.stdout.write(d);
        console.info('\n\nPOST completed');
    });
});

// write the json data
reqPost.write(jsonObject);
reqPost.end();
reqPost.on('error', function(e) {
    console.error(e);
});
12 голосов
/ 31 января 2013

Мне нравится простота суперагента (https://github.com/visionmedia/superagent). Одинаковый API на узле и в браузере.

;(async function() {
  var response = await superagent.post('http://127.0.0.1:8125/', {age: 2})
  console.log(response)
})

Существует также выборка узла (https://www.npmjs.com/package/node-fetch),, API-интерфейс которой соответствует fetch из браузеров), однако для этого требуется ручное кодирование строки запроса, автоматическая обработка типов содержимого не выполняется, и поэтому работает суперагент.

...