эквивалент cURL в Node.js? - PullRequest
       21

эквивалент cURL в Node.js?

129 голосов
/ 25 июля 2011

Я хочу использовать информацию из HTTP-запроса с использованием Node.js (т.е. вызвать удаленный веб-сервис и передать ответ клиенту).

В PHP я бы использовал cURL для этого,Какая лучшая практика в Node?

Ответы [ 17 ]

86 голосов
/ 25 июля 2011

См. Документацию для модуля HTTP для полного примера:

https://nodejs.org/api/http.html#http_http_request_options_callback

65 голосов
/ 25 июля 2011

Модуль http, который вы используете для запуска серверов, также используется для выполнения удаленных запросов.

Вот пример в их документах:

var http = require("http");

var options = {
  host: 'www.google.com',
  port: 80,
  path: '/upload',
  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();
27 голосов
/ 07 января 2016

Вы можете легко использовать модуль запроса:

https://www.npmjs.com/package/request

Пример кода:

var request = require('request');
request('http://www.google.com', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body) // Show the HTML for the Google homepage. 
  }
  else {
    console.log("Error "+response.statusCode)
  }
})
24 голосов
/ 26 мая 2014

Так как похоже, что node-curl мертва, я разветвил его, переименовал и изменил, чтобы он был более скрученным и компилировался в Windows.*

Пример использования:

var Curl = require( 'node-libcurl' ).Curl;

var curl = new Curl();

curl.setOpt( Curl.option.URL, 'www.google.com' );
curl.setOpt( 'FOLLOWLOCATION', true );

curl.on( 'end', function( statusCode, body, headers ) {

    console.info( statusCode );
    console.info( '---' );
    console.info( body.length );
    console.info( '---' );
    console.info( headers );
    console.info( '---' );
    console.info( this.getInfo( Curl.info.TOTAL_TIME ) );

    this.close();
});

curl.on( 'error', function( err, curlErrorCode ) {

    console.error( err.message );
    console.error( '---' );
    console.error( curlErrorCode );

    this.close();

});

curl.perform();

Выполнение асинхронно, , и в настоящее время невозможно использовать его синхронно (и, вероятно, никогда не будет).

Он все еще в альфа-версии, но скоро это изменится, и помощь приветствуется.

Теперь можно использовать дескриптор Easy непосредственно для запросов синхронизации,пример:

var Easy = require( 'node-libcurl' ).Easy,
    Curl = require( 'node-libcurl' ).Curl,
    url = process.argv[2] || 'http://www.google.com',
    ret, ch;

ch = new Easy();

ch.setOpt( Curl.option.URL, url );

ch.setOpt( Curl.option.HEADERFUNCTION, function( buf, size, nmemb ) {

    console.log( buf );

    return size * nmemb;
});

ch.setOpt( Curl.option.WRITEFUNCTION, function( buf, size, nmemb ) {

    console.log( arguments );

    return size * nmemb;
});

// this call is sync!
ret = ch.perform();

ch.close();

console.log( ret, ret == Curl.code.CURLE_OK, Easy.strError( ret ) );

Также проект стабилен!

15 голосов
/ 08 апреля 2015

EDIT:

Для новых проектов, пожалуйста, воздержитесь от использования запроса, так как теперь проект находится в режиме обслуживания и в конечном итоге устарел

https://github.com/request/request/issues/3142

Вместо этого я бы порекомендовал Axios , библиотека соответствует последним стандартам Node, и есть несколько доступных плагинов для ее улучшения, позволяющих имитировать ответы сервера, автоматические повторные попытки и другие функции.

https://github.com/axios/axios

const axios = require('axios');

// Make a request for a user with a given ID
axios.get('/user?ID=12345')
  .then(function (response) {
    // handle success
    console.log(response);
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
  .then(function () {
    // always executed
  });

Или используя async / await:

try{
    const response = await axios.get('/user?ID=12345');
    console.log(response)
} catch(axiosErr){
    console.log(axiosErr)
}

Я обычно использую REQUEST, это упрощенный, но мощный HTTP-клиент для Node.js

https://github.com/request/request

Это на NPM npm install request

Вот пример использования:

var request = require('request');

request('http://www.google.com', function (error, response, body) {
   if (!error && response.statusCode == 200) {
       console.log(body) // Show the HTML for the Google homepage.
   }
})
8 голосов
/ 06 июня 2012

хорошо, если вам действительно нужен скручиваемый эквивалент, вы можете попробовать node-curl

npm install node-curl

, вам, вероятно, потребуется добавить libcurl4-gnutls-dev.

8 голосов
/ 26 июля 2011

Вышеприведенные примеры работают, но не идут так далеко, чтобы действительно иметь дело с реальным примером (т. Е. Когда вы обрабатываете данные, поступающие несколькими порциями). Одна вещь, в которой вы должны убедиться, это то, что у вас есть блок 'on'обработчик, который помещает данные в массив (самый быстрый способ сделать это в JS) и обработчик' on-end ', который объединяет их все вместе, чтобы вы могли вернуть его.

Это особенно необходимо, когда выработа с большими запросами (5000+ строк) и сервер отправляет вам кучу данных.

Вот пример в одной из моих программ (coffeescript): https://gist.github.com/1105888

7 голосов
/ 25 июля 2011
4 голосов
/ 21 июня 2017

Существует модуль npm для выполнения запроса, подобного скручиванию, npm curlrequest.

Шаг 1: $npm i -S curlrequest

Шаг 2: В файле вашего узла

let curl = require('curlrequest')
let options = {} // url, method, data, timeout,data, etc can be passed as options 
curl.request(options,(err,response)=>{
// err is the error returned  from the api
// response contains the data returned from the api
})

Для дальнейшего чтения и понимания: npm curlrequest

2 голосов
/ 18 июня 2018

Использовать модуль npm запроса и после вызова

var request = require('request');
request('http://www.google.com', function (error, response, body) {
  console.log('error:', error); // Print the error if one occurred
  console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
  console.log('body:', body); // Print the HTML for the Google homepage.
});

Для лучшей практики также используйте модуль winston logger или простой файл console.log, а затем запустите ваше приложение, например

npm start output.txt 

Результат приведенной выше команды сгенерирует один текстовый файл в корневом каталоге со всеми данными, которые вы напечатали в console.log

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...