odpowiednik cURL w Node.js?


152

Chcę użyć informacji z żądania HTTP przy użyciu Node.js (tj. Wywołać zdalną usługę internetową i powtórzyć odpowiedź do klienta).

W PHP użyłbym do tego cURL. Jaka jest najlepsza praktyka w Node?


13
http.request...
Raynos,

Problem z tymi wszystkimi rozwiązaniami polega na tym, że wymagają kontroli korsów!
Marco

Odpowiedzi:


103

Pełny przykład można znaleźć w dokumentacji modułu HTTP:

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


10
Warto też request.js wspomnieć
Farzher

2
żądanie http y async, curl to synchronizacja.
e-info128

2
@WHK taka jest natura node.js
slifty

Duży problem, jaki widzę w tym przypadku, polega na tym, że nie możesz po prostu wpisać adresu URL i uzyskać odpowiedzi. Aby o to poprosić, musisz podzielić adres URL na jednostki. Ale, oczywiście, prawdopodobnie jest sposób, po prostu wygodniej byłoby użyć do tego jednego polecenia zwijającego się.
Jānis Gruzis

15
Ta strona może przekonwertować twoje cURLpolecenie na żądanie node.js
Maxim Mai

74

Plik httpModuł użyć do uruchomienia serwerów jest także wykorzystywane do nawiązywania zdalnych żądań.

Oto przykład w ich dokumentach:

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
Jest to bardzo niski poziom w porównaniu z zachowaniem przypominającym zawijanie, o które prosił PO.
Dan Dascalescu

1
Do wszystkich: w dzisiejszych czasach użyj request- npmjs.com/package/request - i zagłosuj poniżej odpowiedzi Nitisha, która jest lepszą odpowiedzią w 2018 roku.
Dan Nissenbaum

Witaj w rzeczywistości: żądanie zostało wycofane, zobacz github.com/request/request/issues/3142 Wydaje mi się, że operacja „niskiego poziomu” ma większy potencjał, ponieważ wcale nie jest niska, to BASIC
vintproykt

35

w prosty sposób możesz skorzystać z modułu zapytań:

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

Przykładowy kod:

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

Ponieważ wygląda na node-curlto, że jest martwy, rozwidliłem go, zmieniłem nazwę i zmodyfikowałem, aby był bardziej podobny do curl i kompilował pod Windows.

node-libcurl

Przykład użycia:

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 jest asynchroniczny i obecnie nie ma możliwości używania go synchronicznie (i prawdopodobnie nigdy nie będzie).

Nadal jest w wersji alfa, ale wkrótce się to zmieni, a pomoc jest mile widziana.

Teraz można używać Easyobsługi bezpośrednio do żądań synchronizacji, na przykład:

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

Ponadto projekt jest teraz stabilny!


Próbowałem zainstalować zarówno node-curl, jak i node-libcurl, ale oba dają mi ten sam komunikat: „Nie można znaleźć pliku nagłówkowego curl”. To jest podczas node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuildkroku. jakieś pomysły?
SaganRitual

@GreatBigBore musisz zainstalować pakiet libcurl devel na swoim komputerze. Jeśli używasz na przykład Debiana, możesz go zainstalować za pomocą$ apt-get install libcurl4-openssl-dev
JCM

1
czy możesz -Ljakoś skorzystać z tej opcji?
corvid

2
Tak: CURLOPT_FOLLOWLOCATION , z node-libcurl, którego będziesz używać curl.setOpt( 'FOLLOWLOCATION', true );. Przy okazji, takie pytania lepiej pasują do śledzenia problemów niż ta sekcja komentarzy. ;)
JCM

23

EDYTOWAĆ:

W przypadku nowych projektów powstrzymaj się od używania żądania, ponieważ teraz projekt jest w trybie zarządzania i ostatecznie zostanie wycofany

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

Zamiast tego poleciłbym Axios , biblioteka jest zgodna z najnowszymi standardami Node i jest kilka dostępnych wtyczek, które ją ulepszają, umożliwiając pozorowane odpowiedzi serwera, automatyczne ponawianie i inne funkcje.

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

Lub używając async / await:

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

Zwykle używam REQUEST, jest to uproszczony, ale potężny klient HTTP dla Node.js.

https://github.com/request/request

Jest na NPM npm install request

Oto próbka użycia:

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

cóż, jeśli naprawdę potrzebujesz odpowiednika loków, możesz spróbować node-curl

npm install node-curl

prawdopodobnie będziesz musiał dodać libcurl4-gnutls-dev.


8

Powyższe przykłady działają, ale nie posuwają się tak daleko, aby naprawdę zajmować się przykładem ze świata rzeczywistego (tj. Gdy przetwarzasz dane w wielu fragmentach. Jedną rzeczą, którą musisz upewnić się, jest to, że masz moduł obsługi „on chunk”), który wypycha dane do tablicy (najszybszy sposób na zrobienie tego w JS) i modułu obsługi „na końcu”, który łączy je wszystkie razem, aby można było je zwrócić.

Jest to szczególnie konieczne, gdy pracujesz z dużymi żądaniami (ponad 5000 linii), a serwer wysyła do ciebie mnóstwo danych.

Oto przykład w jednym z moich programów (coffeescript): https://gist.github.com/1105888



4

Istnieje moduł npm do tworzenia curl like request, npm curlrequest .

Krok 1: $npm i -S curlrequest

Krok 2: w pliku węzłów

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

W celu dalszego czytania i zrozumienia, npm curlrequest


3

Użyj modułu request npm i po wywołaniu

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

Aby uzyskać najlepszą praktykę, użyj również modułu rejestratora winston lub prostego pliku console.log, a następnie uruchom aplikację, taką jak

npm start output.txt 

Wynik powyższego polecenia wygeneruje jeden plik txt w katalogu głównym ze wszystkimi danymi, które wypisałeś w console.log


1

Skończyło się na tym, że korzystałem z biblioteki grunt-shell .

Tutaj moje źródło mojego w pełni zaimplementowanego zadania Grunt dla każdego, kto myśli o pracy z EdgeCast API. W moim przykładzie zobaczysz, że używam powłoki gruntowej do wykonania polecenia curl, które czyści CDN.

Skończyło się na tym, że spędziłem wiele godzin próbując uzyskać żądanie HTTP do pracy w Node. Udało mi się uzyskać taki działający w Rubim i Pythonie, ale nie spełniał wymagań tego projektu.


1

Używa reqclient , jest to mały moduł klienta, requestktóry umożliwia rejestrowanie całej aktywności w stylu cURL (opcjonalnie, dla środowisk programistycznych). Posiada również fajne funkcje, takie jak parsowanie adresów URL i parametrów, integracje uwierzytelniania, obsługa pamięci podręcznej itp.

Na przykład, jeśli utworzysz obiekt klienta, wykonaj żądanie:

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

W konsoli zaloguje się coś takiego:

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

Żądanie zwróci obiekt Promise , więc musisz sobie poradzić z wynikiem theni catchco z nim zrobić.

reqclientdostępny jest z KMP , można zainstalować moduł z: npm install reqclient.


1

Miałem problem z wysyłaniem danych POST do chmury DB z IOT RaspberryPi, ale po godzinach udało mi się to prosto.

Użyłem do tego wiersza poleceń.

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

Wiersz polecenia pokaże problemy - zła nazwa użytkownika / hasło; zła prośba itp.

- Lokalizacja bazy danych / serwera URL (użyłem prostej, bezpłatnej bazy danych Cloudant) --user to nazwa użytkownika części uwierzytelniającej: hasło wprowadzone przez interfejs API -X określa, jakie polecenie wywołać (PUT, GET, POST, DELETE) -H typ zawartości - Cloudant dotyczy bazy danych dokumentów, w której używany jest JSON - sama zawartość danych posortowana jako JSON


1

Moduł żądania npm Moduł żądania węzła jest dobry w użyciu, ma ustawienia opcji dla żądania pobierania / wysyłania, a także jest szeroko stosowany w środowisku produkcyjnym.


0

Możesz spróbować użyć czegoś takiego

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

Możesz spróbować użyć aplikacji POSTMAN Chrome na swoje żądanie i możesz z niej wygenerować kod węzła js


0

Możesz użyć modułu request npm. Bardzo prosty w użyciu. Żądanie ma być najprostszym możliwym sposobem wykonywania połączeń HTTP. Obsługuje protokół HTTPS i domyślnie śledzi przekierowania.

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.
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.