wake-up-neo.net

cURL-Äquivalent in Node.js?

Ich möchte Informationen aus einer HTTP-Anfrage mit Node.js verwenden (z. B. einen Remote-Webdienst aufrufen und die Antwort an den Client senden).

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

117
slifty

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

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

79
Dan Grossman

Das http -Modul, das Sie zum Ausführen von Servern verwenden, wird auch für Fernanforderungen 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();
64
Jeremy Banks

Da es so aussieht, als wäre node-curl tot, habe ich es gegabelt, umbenannt und modifiziert, um mehr Locken zu sein 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();

Durchführen ist asynchron, und es ist derzeit nicht möglich, es synchron zu verwenden (und wird es wahrscheinlich niemals haben).

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

Jetzt ist es möglich, Easy handle 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!

23
JCM

sie können das Anforderungsmodul problemlos 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)
  }
})
22
Nitish Agarwal

Ich benutze normalerweise REQUEST, einen vereinfachten, aber leistungsfähigen HTTP-Client für Node.js

https://github.com/request/request

Es ist auf NPM npm install request 

Hier ist ein Verwendungsbeispiel:

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

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

Dies ist insbesondere dann erforderlich, wenn Sie mit großen Anfragen (ü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

8
Brad Dickason

wenn Sie wirklich ein Curl-Äquivalent benötigen, können Sie node-curl ausprobieren. 

npm install node-curl

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

7
warfares
7
Alfred

Es gibt ein npm-Modul, um eine curl-artige Anfrage zu machen, 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
})

Für weitere Lektüre und Verständnis, npm curlrequest

4
Laksh Goel

Verwenden Sie das Request-npm-Modul und nach dem Aufruf 

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 ein bewährtes Verfahren auch ein beliebiges winston logger - Modul oder einfach die Konsole.log und führen Sie dann Ihre Anwendung wie 

npm start output.txt 

Das Ergebnis des obigen Befehls erzeugt eine TXT-Datei mit allen Daten, die Sie in der Konsole.log gedruckt haben, im Stammverzeichnis 

2
D M Patel

Verwendet reqclient , ist dies ein kleines Client-Modul oberhalb von request, mit dem Sie alle Aktivitäten mit dem cURL-Stil protokollieren (optional für Entwicklungsumgebungen) können. Enthält auch Nice-Funktionen wie URL- und Parameter-Analyse, Authentifizierungsintegrationen, Cache-Unterstützung usw.

Wenn Sie beispielsweise ein Client-Objekt 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 so etwas in der Konsole 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, daher müssen Sie mit then und catch umgehen, was mit dem Ergebnis zu tun ist.

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

1
Mariano Ruiz

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

Ich habe dazu den Befehl Prompt 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 etc.

--URL Datenbank-/Serverstandort (ich habe eine einfache freie Cloudant-Datenbank verwendet) -- Benutzer ist der Authentifizierungsteil Benutzername: Pass, den ich über API eingegeben habe. DELETE) - H Inhaltstyp - Cloudant handelt von der Dokumentendatenbank, in der JSON verwendet wird -- Dateninhalt selbst als JSON sortiert

1
Rudolfs

Am Ende habe ich die grunt-Shell library benutzt.

Hier ist meine Quelle Gist für meine vollständig implementierte Grunt-Aufgabe für alle anderen, die über die Arbeit mit der EdgeCast-API nachdenken. In meinem Beispiel werden Sie feststellen, dass ich mit einer grunt-Shell den curl-Befehl ausführt, der das CDN löscht.

Dies war, dass ich am Ende endete, nachdem ich stundenlang versucht hatte, eine HTTP-Anfrage für die Arbeit mit Node zu bekommen. Ich konnte einen in Ruby und Python arbeiten lassen, entsprach aber nicht den Anforderungen dieses Projekts.

Request npm module Request node moulde ist gut zu bedienen, es hat Optionseinstellungen für die get/post-Anforderung und wird auch in der Produktionsumgebung häufig verwendet.

1
Indrani Sen

Vielleicht möchten Sie so etwas ausprobieren 

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

Sie können das Request-npm-Modul verwenden. Super einfach zu verwenden. Die Anfrage ist die einfachste Möglichkeit, um http-Anrufe zu tätigen. Es unterstützt HTTPS und folgt standardmäßig Umleitungen.

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

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

0
Ravi Teja