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


152

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

У PHP я б використав CURL для цього. Яка найкраща практика в Node?


13
http.request...
Райнос

Проблема з усіма цими рішеннями полягає в тому, що вони потребують контролю корів!
Марко

Відповіді:


103

Повний приклад див. У документації до модуля HTTP:

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


10
Також варто зазначити, що тут дуже популярна бібліотека обгортки request.js github.com/mikeal/request
Farzher

2
http запит y async, curl - це синхронізація.
e-info128

2
@WHK така природа node.js
slifty

Велика проблема, яку я бачу в цьому, полягає в тому, що ви не можете просто ввести URL-адресу та отримати відповідь. Вам потрібно відокремити URL-адресу в одиницях, щоб надіслати її. Але з прокляття, мабуть, є спосіб, просто було б зручніше використовувати для цього одну завивку, як команду.
Jānis Gruzis

15
Цей сайт може перетворити вашу cURLкоманду на node.js запит: curl.trillworks.com/#node
Максим Май

74

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();

14
Це дуже низький рівень порівняно з поведінкою, що нагадує завиток, про яку попросила ОП.
Дан Даскалеску

1
Для всіх: Сьогодні використовуйте request- npmjs.com/package/request - і підтверджуйте відповідь Нітіша внизу, яка найкраща відповідь у 2018 році.
Дан Ніссенбаум,

Ласкаво просимо в реальність: запит застарілий, див. Github.com/request/request/isissue/3142 Мені здається, що операція "низького рівня" має більше потенціалу, ніж ця, тому що вона зовсім не низька, це ОСНОВНА
vintproykt

35

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

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)
  }
})

27

Оскільки зовні схоже node-curlна мертве, я відправив його, перейменував і змінив, щоб він був більше закрученим і компілювався під Windows.

node-libcurl

Приклад використання:

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 ) );

Також проект стабільний зараз!


Я спробував встановити і node-curl, і node-libcurl, але обидва дають мені те саме повідомлення: "Неможливо знайти файл заголовка curl". Це під час node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuildкроку. Будь-які думки?
SaganRitual

@GreatBigBore вам потрібен пакет розробок libcurl, встановлений на вашій машині. Якщо ви, наприклад, використовуєте debian, можете встановити його за допомогою$ apt-get install libcurl4-openssl-dev
JCM

1
ви можете -Lякось використовувати варіант?
коровай

2
Так: CURLOPT_FOLLOWLOCATION , з вузлом-libcurl, який ви збираєтеся використовувати curl.setOpt( 'FOLLOWLOCATION', true );. До речі, подібні запитання краще підходять для відстеження питань, ніж цей розділ коментарів. ;)
JCM

23

Редагувати:

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

https://github.com/request/request/isissue/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 / wait:

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

Зазвичай я використовую ЗАПИТАННЯ, його спрощений, але потужний клієнт 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.
   }
})

9

добре, якщо вам дійсно потрібен еквівалент завитки, ви можете спробувати node-curl

npm install node-curl

вам, ймовірно, потрібно буде додати libcurl4-gnutls-dev.


8

Наведені вище приклади працюють, але не йдуть настільки далеко, щоб реально мати справу з прикладом реального світу (тобто, коли ви обробляєте дані, що надходять у декілька фрагментів. Одне, що вам потрібно переконатися, - це те, що у вас є обробник "на шматок", який натисніть дані в масив (найшвидший спосіб зробити це в JS) і обробник "на кінець", який з'єднує їх усі разом, щоб ви могли повернути їх.

Це особливо необхідно, коли ви працюєте з великими запитами (5000+ рядків) і сервер надсилає вам купу даних.

Ось приклад в одній із моїх програм (coffeescript): https://gist.github.com/1105888



4

Існує НОЕ модуль , щоб зробити завиток як прохання 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


3

Використовувати запит 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 або інший простий console.log, а потім запустіть додаток, як

npm start output.txt 

Результат вищевказаної команди генерує один файл txt у root із усіма даними, які ви надрукували у console.log


1

Я в кінцевому рахунку використовував бібліотеку grunt-shell .

Ось мій суть джерела моєї повністю реалізованої задачі Grunt для всіх, хто думає про роботу з API EdgeCast. Ви побачите в моєму прикладі, що я використовую grunt-shell для виконання команди curl, яка очищує CDN.

Це я закінчив, витративши години, намагаючись отримати HTTP-запит на роботу в Node. Мені вдалося отримати одного, хто працює в Ruby та Python, але не відповідав вимогам цього проекту.


1

Використовує reqclient , це невеликий клієнтський модуль, requestякий дозволяє вам реєструвати всю активність у стилі CURL (необов’язково для середовищ розробки). Також є приємні функції, такі як розбір URL-адрес і параметрів, інтеграція автентифікації, підтримка кешу тощо.

Наприклад, якщо ви створюєте клієнтський об'єкт, зробіть запит:

var RequestClient = require("reqclient").RequestClient;
var client = new RequestClient({
        baseUrl:"http://baseurl.com/api/v1.1",
        debugRequest:true, debugResponse:true
    });

var resp = client.post("client/orders", {"client":1234,"ref_id":"A987"}, {headers: {"x-token":"AFF01XX"}})

Він увійде в консоль приблизно так:

[Requesting client/orders]-> -X POST http://baseurl.com/api/v1.1/client/orders -d '{"client": 1234, "ref_id": "A987"}' -H '{"x-token": "AFF01XX"}' -H Content-Type:application/json
[Response   client/orders]<- Status 200 - {"orderId": 1320934}

Запит поверне об’єкт Promise , тому вам доведеться впоратися thenі catchщо робити з результатом.

reqclientдоступний з НПМ , ви можете встановити модуль з: npm install reqclient.


1

У мене виникла проблема з надсиланням даних POST до хмарного БД з IOT RaspberryPi, але через години мені вдалося зрозуміти це.

Для цього я використав командний рядок.

sudo curl --URL http://<username>.cloudant.com/<database_name> --user <api_key>:<pass_key> -X POST -H "Content-Type:application/json" --data '{"id":"123","type":"987"}'

Командний рядок покаже проблеми - неправильне ім’я користувача / пропуск; поганий запит тощо.

- Місце розташування бази даних / сервера (я використовував просту безкоштовну DB-модуль Cloudant) - користувач - це ім'я частини автентифікації: pass Я ввів через пропуск API -X визначає, яку команду викликати (PUT, GET, POST, DELETE) -H тип вмісту - Cloudant - це база даних документів, де використовується JSON - вміст самих даних, відсортований як JSON



0

Ви можете спробувати використати щось подібне

curl = require('node-curl');
curl('www.google.com', function(err) {
  console.info(this.status);
  console.info('-----');
  console.info(this.body);
  console.info('-----');
  console.info(this.info('SIZE_DOWNLOAD'));
});

0

Ви можете спробувати скористатися додатком POSTMAN Chrome для свого запиту, і ви можете згенерувати звідси js-код вузла


0

Ви можете використовувати модуль запиту npm. Супер простий у використанні. Запит розрахований на найпростіший спосіб здійснення http-дзвінків. Він підтримує HTTPS і слід переспрямувати за замовчуванням.

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.
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.