Curl эквивалент в nodejs?

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

В PHP я бы использовал curl для этого. Какова наилучшая практика в node?

Ответ 2

Модуль 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();

Ответ 3

Так как выглядит 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();

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

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

Теперь можно использовать дескриптор 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 ) );

Кроме того, теперь проект стабилен!

Ответ 4

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

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

Ответ 5

Я обычно использую 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.
   }
})

Ответ 6

Приведенные выше примеры работают, но не заходят так далеко, чтобы действительно иметь дело с примером реального мира (т.е. когда вы обрабатываете данные, поступающие в несколько фрагментов). Одна вещь, которую вы должны убедиться, состоит в том, что у вас есть "на куске" обработчик, который выталкивает данные в массив (самый быстрый способ сделать это в JS) и обработчик "on end", который объединяет их все вместе, чтобы вы могли его вернуть.

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

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

Ответ 8

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

npm install node-curl

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

Ответ 9

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

Шаг 1: $npm i -S curlrequest

Шаг 2. В вашем node файле

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

Ответ 10

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

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

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

Ответ 11

Использует reqclient, это небольшой клиентский модуль поверх request, который позволяет регистрировать все действия с помощью cURL style (необязательно, для среды разработки). Также имеет приятные функции, такие как анализ 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, вы можете установить модуль с помощью npm install reqclient.

Ответ 12

Возможно, вы захотите попробовать что-то вроде этого

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

Ответ 13

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

Ответ 14

У меня возникла проблема с отправкой данных 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) --user - это имя пользователя аутентификации: pass I, введенный через API-интерфейс -X определяет, какую команду вызывать (PUT, GET, POST, DELETE) -H тип контента - Cloudant - это база данных документов, в которой используется JSON - сам контент данных отсортирован как JSON