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.