эквивалент 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 асинхронный, curl является синхронизированным.
e-info128

2
@WHK - такова природа node.js
скользко

Большая проблема, которую я вижу с этим, состоит в том, что вы не можете просто ввести URL и получить ответ. Вы должны разделить URL в единицах измерения, чтобы запросить его. Но, конечно, есть способ, просто было бы удобнее использовать для этого одну команду, похожую на curl.
Янис Грузис

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/issues/3142 Мне кажется, что операция «низкого уровня» имеет больший потенциал, чем эта, потому что она совсем не низкая, это BASIC
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();

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 devel, установленный на вашем компьютере. Например, если вы используете Debian, вы можете установить его с$ apt-get install libcurl4-openssl-dev
JCM

1
Вы можете использовать эту -Lопцию как-нибудь?
Corvid

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

23

РЕДАКТИРОВАТЬ:

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

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

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

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

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



4

Существует модуль npm для выполнения запроса типа curl 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 Logger или простой файл console.log, а затем запустите ваше приложение, например:

npm start output.txt 

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


1

В итоге я использовал библиотеку grunt-shell .

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

Это было то, что я закончил после нескольких часов, пытаясь получить HTTP-запрос для работы в Node. Мне удалось получить один работающий в Ruby и Python, но не отвечал требованиям этого проекта.


1

Использует reqclient , это небольшой клиентский модуль, requestкоторый позволяет вам регистрировать все действия в стиле cURL (необязательно, для сред разработки). Также имеет приятные функции, такие как разбор URL и параметров, интеграция аутентификации, поддержка кэша и т. Д.

Например, если вы создаете объект client и делаете запрос:

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"}'

Командная строка покажет проблемы - неправильное имя пользователя / пароль; плохой запрос и т. д.

--URL база данных / расположение сервера (я использовал простую бесплатную Cloudant DB) --user - имя пользователя части аутентификации: pass, который я ввел через API pass -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.