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?
Ein vollständiges Beispiel finden Sie in der Dokumentation zum HTTP-Modul:
https://nodejs.org/api/http.html#http_http_request_options_callback
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();
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.
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!
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)
}
})
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.
}
})
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
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.
Wie wäre es zum Beispiel https://github.com/joyent/node/wiki/modules#wiki-tcp . Eine sehr kurze Zusammenfassung =>
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
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
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.
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
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.
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'));
});
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.
});
Sie können versuchen, die POSTMAN Chrome-App für Ihre Anfrage zu verwenden und von dort aus Knoten-Js-Code zu erzeugen