Équivalent Curl dans nodejs?
Je cherche à utiliser les informations d'une requête HTTP en utilisant nodejs (c'est-à-dire appeler un service web distant et faire écho à la réponse au client).
En PHP, j'aurais utilisé curl pour le faire. Quelle est la meilleure pratique dans le nœud?
17 réponses
Voir la documentation du module HTTP pour un exemple complet:
Https://nodejs.org/api/http.html#http_http_request_options_callback
Le http
module que vous utilisez pour exécuter des serveurs est également utilisé pour faire les demandes à distance.
Voici l'exemple dans leurs docs:
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();
Depuis ressemble à node-curl
est mort, je l'ai bifurqué, renommé et modifié pour être plus curl et compiler sous Windows.
Exemple d'Utilisation:
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();
Effectuer est asynchrone, et il n'y a aucun moyen de l'utiliser synchrone actuellement (et ne sera probablement jamais).
C'est encore en alpha, mais cela va bientôt changer, et l'aide est appréciée.
Maintenant, il est possible d'utiliser Easy
gérer directement pour la synchronisation demandes, exemple:
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 ) );
Aussi, le projet est stable maintenant!
Vous pouvez facilement utiliser le module de requête:
Https://www.npmjs.com/package/request
Exemple de code:
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)
}
})
J'utilise habituellement REQUEST, c'est un client HTTP simplifié mais puissant pour le nœud.js
Https://github.com/request/request
Son sur NPM
npm install request
Voici un exemple d'utilisation:
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.
}
})
Les exemples ci-dessus fonctionnent mais ne vont pas jusqu'à traiter un exemple réel (c'est-à-dire lorsque vous traitez des données en plusieurs morceaux. Une chose dont vous devez vous assurer est que vous avez un gestionnaire 'on chunk' qui pousse les données dans un tableau (le moyen le plus rapide de le faire dans JS) et un gestionnaire 'on end' qui les relie tous ensemble afin que vous puissiez le retourner.
Ceci est particulièrement nécessaire lorsque vous travaillez avec de grandes requêtes (5000 + lignes) et que le serveur envoie un tas de données à vous.
Voici un exemple dans l'un de mes programmes (coffeescript): https://gist.github.com/1105888
Que diriez-vous par exemple https://github.com/joyent/node/wiki/modules#wiki-tcp . un résumé très rapide = >
Il y a un module npm pour faire une requête de type curl, npm curlrequest
.
Étape 1: $npm i -S curlrequest
Étape 2: dans votre fichier de nœud
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
})
Pour plus de lecture et de compréhension, mnp curlrequest
J'ai fini par utiliser la bibliothèqueGrunt-shell .
Voici Mon Essentiel source pour ma tâche Grunt entièrement implémentée pour quiconque pense à travailler avec L'API EdgeCast. Vous trouverez dans mon exemple que j'utilise un Grunt-shell pour exécuter la commande curl qui purge le CDN.
C'est ce que j'ai fini avec après avoir passé des heures à essayer d'obtenir une requête HTTP pour fonctionner dans le nœud. J'ai été en mesure d'en faire fonctionner un en Ruby et Python, mais je ne répondais pas aux exigences de ce projet.
Utilise reqclient , c'est un petit module client au-dessus de request
qui vous permet de consigner toute l'activité avec le style cURL (facultatif, pour les environnements de développement). A également de belles fonctionnalités comme L'analyse des URL et des paramètres, les intégrations d'authentification, le support du cache, etc.
Par exemple, si vous créez un objet client, effectuez une requête:
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"}})
Il se connectera dans la console quelque chose comme ceci:
[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}
La demande renverra une promesse objet, donc vous devez gérer avec then
et catch
Que faire avec le résultat.
reqclient
est disponible avec mnp, vous pouvez installer le module avec: npm install reqclient
.
J'ai eu un problème pour envoyer des données POST à cloud DB à partir de IOT RaspberryPi, mais après des heures, j'ai réussi à tout faire.
J'ai utilisé l'invite de commande pour le faire.
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"}'
Invite de commande montrera les problèmes - mauvais nom d'utilisateur / passe; mauvaise demande, etc.
-- URL database/server location (j'ai utilisé simple free Cloudant DB) -- user est le nom d'utilisateur de la partie d'authentification: passe que j'ai entré via API pass - X définit la commande à appeler (PUT, GET, POST, DELETE) - H Type de contenu-Cloudant est à propos de la base de données de documents, où JSON est utilisé -- le contenu des données lui-même trié comme JSON
Request npm module Request node moulde est bon à utiliser, il a des paramètres d'options pour get / POST request plus il est largement utilisé dans l'environnement de production aussi.
Utiliser le module request npm et après l'appel
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.
});
Pour les meilleures pratiques, utilisez également un modulewinston logger ou une console simple.journal et puis exécutez votre application comme
npm start output.txt
Le résultat de la commande ci-dessus générera un fichier txt sur root avec toutes les données que vous avez imprimées dans la console.log
, Vous pouvez essayer d'utiliser quelque chose comme ceci
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'));
});
Vous pouvez essayer D'utiliser L'application POSTMAN Chrome pour votre demande et vous pouvez générer du code node JS à partir de là
Vous pouvez utiliser le module request npm . Super simple à utiliser. Request est conçu pour être le moyen le plus simple possible de faire des appels http. Il prend en charge HTTPS et suit les redirections par défaut.
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.
});