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?
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?
Antworten:
Ein vollständiges Beispiel finden Sie in der Dokumentation zum HTTP-Modul:
https://nodejs.org/api/http.html#http_http_request_options_callback
request.js
Github.com/mikeal/request
cURL
Befehl in die Anfrage von node.js konvertieren : curl.trillworks.com/#node
Das http
Modul, 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();
request
- npmjs.com/package/request - und stimmen Sie Nitishs Antwort unten zu, die die bessere Antwort im Jahr 2018 ist.
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)
}
})
Da es so aussieht, als wäre node-curl
es tot, habe ich es gegabelt, umbenannt und modifiziert, um es besser zu machen und unter Windows zu kompilieren.
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, 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!
node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuild
Schritts. Irgendwelche Gedanken?
$ apt-get install libcurl4-openssl-dev
-L
Option irgendwie nutzen?
curl.setOpt( 'FOLLOWLOCATION', true );
. Übrigens sind solche Fragen besser für den Issue-Tracker geeignet als dieser Kommentarbereich. ;)
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.
}
})
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
Wie wäre es zum Beispiel mit https://github.com/joyent/node/wiki/modules#wiki-tcp . Eine sehr schnelle Zusammenfassung =>
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
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
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.
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 then
und catch
was mit dem Ergebnis zu tun ist.
reqclient
ist mit npm verfügbar , können Sie das Modul installieren mit : npm install reqclient
.
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
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.
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'));
});
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.
});
http.request
...