cURL-Äquivalent in Node.js?

152

Ich möchte Informationen aus einer HTTP-Anfrage mit Node.js verwenden (dh einen Remote-Webdienst aufrufen und die Antwort an den Client zurückgeben).

In PHP hätte ich dazu cURL verwendet. Was ist die beste Vorgehensweise in Node?

schlampig
quelle
13
http.request...
Raynos
Das Problem bei all diesen Lösungen ist, dass sie die Kontrolle über Cors erfordern!
Marco

Antworten:

103

Ein vollständiges Beispiel finden Sie in der Dokumentation zum HTTP-Modul:

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

Dan Grossman
quelle
10
Es ist auch erwähnenswert, dass es eine sehr beliebte Wrapper-Bibliothek gibt. request.js Github.com/mikeal/request
Farzher
2
http Anfrage y async, Curl ist synchron.
E-Info128
2
@WHK so ist die Natur von node.js
slifty
Das große Problem, das ich dabei sehe, ist, dass Sie nicht einfach die URL eingeben und eine Antwort erhalten können. Sie müssen die URL in Einheiten trennen, um sie anzufordern. Aber vom Fluch gibt es wahrscheinlich einen Weg, es wäre einfach bequemer, dafür einen Befehl wie eine Locke zu verwenden.
Jānis Gruzis
15
Diese Seite kann Ihren cURLBefehl in die Anfrage von node.js konvertieren : curl.trillworks.com/#node
Maxim Mai
74

Das httpModul, mit dem Sie Server ausführen, wird auch zum Erstellen von Remoteanforderungen verwendet.

Hier ist das Beispiel in ihren Dokumenten:

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();
Jeremy Banks
quelle
14
Dies ist ein sehr niedriges Niveau im Vergleich zu dem vom OP geforderten lockenartigen Verhalten.
Dan Dascalescu
1
An alle: Heutzutage verwenden Sie request- npmjs.com/package/request - und stimmen Sie Nitishs Antwort unten zu, die die bessere Antwort im Jahr 2018 ist.
Dan Nissenbaum
Willkommen in der Realität: Die Anfrage wurde abgelehnt, siehe github.com/request/request/issues/3142. Mir scheint, dass "Low-Level"
-Operationen
35

Sie können das Anforderungsmodul einfach verwenden:

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

Beispielcode:

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)
  }
})
Nitish Agarwal
quelle
27

Da es so aussieht, als wäre node-curles tot, habe ich es gegabelt, umbenannt und modifiziert, um es besser zu machen und unter Windows zu kompilieren.

node-libcurl

Anwendungsbeispiel:

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 ist asynchron und es gibt derzeit keine Möglichkeit, es synchron zu verwenden (und wird es wahrscheinlich nie haben).

Es ist immer noch in Alpha, aber das wird sich bald ändern, und Hilfe wird geschätzt.

Jetzt ist es möglich, Easyhandle direkt für Synchronisierungsanforderungen zu verwenden, Beispiel:

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

Auch das Projekt ist jetzt stabil!

JCM
quelle
Ich habe versucht, sowohl Node-Curl als auch Node-Libcurl zu installieren, aber beide geben mir die gleiche Meldung: "Die Header-Datei von Curl kann nicht gefunden werden." Dies ist während des node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuildSchritts. Irgendwelche Gedanken?
SaganRitual
@GreatBigBore Sie müssen das libcurl-Entwicklungspaket auf Ihrem Computer installiert haben. Wenn Sie beispielsweise Debian verwenden, können Sie es mit$ apt-get install libcurl4-openssl-dev
JCM
1
Kannst du die -LOption irgendwie nutzen?
Corvid
2
Ja: CURLOPT_FOLLOWLOCATION , mit node-libcurl werden Sie verwenden curl.setOpt( 'FOLLOWLOCATION', true );. Übrigens sind solche Fragen besser für den Issue-Tracker geeignet als dieser Kommentarbereich. ;)
JCM
23

BEARBEITEN:

Bei neuen Projekten verwenden Sie bitte keine Anfrage, da sich das Projekt jetzt im Wartungsmodus befindet und möglicherweise nicht mehr unterstützt wird

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

Stattdessen würde ich Axios empfehlen , die Bibliothek entspricht den neuesten Node-Standards, und es gibt einige verfügbare Plugins, um sie zu verbessern und Schein-Server-Antworten, automatische Wiederholungsversuche und andere Funktionen zu ermöglichen.

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

Oder mit async / await:

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

Normalerweise verwende ich REQUEST, einen vereinfachten, aber leistungsstarken HTTP-Client für Node.js.

https://github.com/request/request

Es ist auf NPM npm install request

Hier ist ein Anwendungsbeispiel:

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.
   }
})
Aronis Mariano
quelle
9

Wenn Sie wirklich ein Curl-Äquivalent benötigen, können Sie es versuchen node-curl

npm install node-curl

Sie müssen wahrscheinlich hinzufügen libcurl4-gnutls-dev.

Warfares
quelle
8

Die obigen Beispiele funktionieren, gehen jedoch nicht so weit, dass sie sich wirklich mit einem Beispiel aus der realen Welt befassen (dh wenn Sie Daten verarbeiten, die in mehreren Blöcken eingehen. Eine Sache, die Sie sicherstellen müssen, ist, dass Sie einen "On-Chunk" -Handler haben, der dies tut Schieben Sie die Daten in ein Array (der schnellste Weg, dies in JS zu tun) und einen On-End-Handler, der sie alle zusammenfügt, damit Sie sie zurückgeben können.

Dies ist besonders erforderlich, wenn Sie mit großen Anforderungen (über 5000 Zeilen) arbeiten und der Server eine Reihe von Daten an Sie sendet.

Hier ist ein Beispiel in einem meiner Programme (Coffeescript): https://gist.github.com/1105888

Brad Dickason
quelle
4

Es gibt ein npm-Modul, um eine Curl-ähnliche Anfrage zu stellen. npm curlrequest .

Schritt 1: $npm i -S curlrequest

Schritt 2: In Ihrer Knotendatei

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

Zum weiteren Lesen und Verstehen npm curlrequest

Laksh Goel
quelle
3

Verwenden Sie das Request-Npm-Modul und nach dem Anruf

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

Verwenden Sie für bewährte Methoden auch ein Winston Logger-Modul oder eine einfache console.log und führen Sie dann Ihre Anwendung wie folgt aus

npm start output.txt 

Das Ergebnis des obigen Befehls generiert eine txt-Datei im Stammverzeichnis mit allen Daten, die Sie in console.log gedruckt haben

DM Patel
quelle
1

Am Ende habe ich die Grunt-Shell- Bibliothek benutzt.

Hier ist mein Quelltext für meine vollständig implementierte Grunt-Aufgabe für alle anderen, die über die Arbeit mit der EdgeCast-API nachdenken. In meinem Beispiel finden Sie, dass ich eine Grunt-Shell verwende, um den Curl-Befehl auszuführen, der das CDN löscht.

Dies geschah, nachdem ich stundenlang versucht hatte, eine HTTP-Anfrage für Node zum Laufen zu bringen. Ich konnte einen in Ruby und Python zum Laufen bringen, erfüllte aber nicht die Anforderungen dieses Projekts.

Erdbeer-Marshmallow
quelle
1

Verwendet reqclient , es ist ein kleines Client-Modul request, mit dem Sie alle Aktivitäten im cURL-Stil protokollieren können (optional für Entwicklungsumgebungen). Hat auch nette Funktionen wie URL- und Parameteranalyse, Authentifizierungsintegrationen, Cache-Unterstützung usw.

Wenn Sie beispielsweise ein Clientobjekt erstellen und eine Anforderung ausführen:

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

Es wird in der Konsole ungefähr so ​​protokolliert:

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

Die Anfrage gibt ein Promise- Objekt zurück, sodass Sie damit umgehen müssen thenund catchwas mit dem Ergebnis zu tun ist.

reqclientist mit npm verfügbar , können Sie das Modul installieren mit : npm install reqclient.

Mariano Ruiz
quelle
1

Ich hatte ein Problem beim Senden von POST-Daten von IOT RaspberryPi an die Cloud-Datenbank, aber nach Stunden gelang es mir, diese zu korrigieren.

Ich habe dazu die Eingabeaufforderung verwendet.

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

Die Eingabeaufforderung zeigt die Probleme an - falscher Benutzername / Pass; schlechte Anfrage usw.

--URL Datenbank- / Serverspeicherort (ich habe einfache kostenlose Cloudant-Datenbank verwendet) --user ist der Benutzername des Authentifizierungsteils: pass, den ich über die API eingegeben habe pass -X definiert, welcher Befehl aufgerufen werden soll (PUT, GET, POST, DELETE) -H Inhaltstyp - Bei Cloudant handelt es sich um eine Dokumentendatenbank, in der JSON verwendet wird. - Dateninhalt selbst sortiert nach JSON

Rudolfs
quelle
1

Request npm module Request Node Moulde ist gut zu verwenden, verfügt über Optionseinstellungen für Get / Post Request und ist auch in Produktionsumgebungen weit verbreitet.

Indrani Sen.
quelle
0

Vielleicht möchten Sie versuchen, so etwas zu verwenden

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'));
});
Gautam Anand
quelle
0

Sie können versuchen, die POSTMAN Chrome-App für Ihre Anfrage zu verwenden, und von dort aus den Knoten-JS-Code generieren

Ravi Teja
quelle
0

Sie können das Modul request npm verwenden. Super einfach zu bedienen. Die Anfrage soll die einfachste Möglichkeit sein, http-Anrufe zu tätigen. Es unterstützt HTTPS und folgt standardmäßig Weiterleitungen.

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