Je cherche à utiliser les informations d’une requête HTTP à l’aide de Node.js (c’est-à-dire appeler un service Web distant et envoyer la réponse au client).
Dans PHP, j'aurais utilisé cURL pour le faire. Quelle est la meilleure pratique dans Node?
Voir la documentation du module HTTP pour un exemple complet:
https://nodejs.org/api/http.html#http_http_request_options_callback
Le module http
que vous utilisez pour exécuter des serveurs est également utilisé pour effectuer des requêtes à distance.
Voici l'exemple dans leur documentation:
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();
Comme il semblerait que node-curl
soit mort, je l'ai créé, renommé et modifié pour être plus fluide 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();
Perform est asynchrone, et il n'y a aucun moyen de l'utiliser de manière synchrone actuellement (et ne l'aura probablement jamais).
Il est toujours en alpha, mais cela va bientôt changer, et l'aide est appréciée.
Maintenant, il est possible d'utiliser Easy
directement pour les demandes de synchronisation, par 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 ) );
De plus, 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 Node.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 réellement d'un exemple concret (par exemple, lorsque vous traitez des données provenant de plusieurs morceaux. Vous devez vous assurer que vous disposez d'un Enfoncez les données dans un tableau (moyen le plus rapide de le faire dans JS) et un gestionnaire 'on end' qui les rassemble afin que vous puissiez les renvoyer.
Cela est particulièrement nécessaire lorsque vous travaillez avec de grandes demandes (plus de 5 000 lignes) et que le serveur vous envoie une foule de données.
Voici un exemple dans un de mes programmes (coffeescript): https://Gist.github.com/1105888
bien si vous avez vraiment besoin d’un équivalent de curl, vous pouvez essayer node-curl
npm install node-curl
vous devrez probablement ajouter libcurl4-gnutls-dev
.
Que diriez-vous par exemple https://github.com/joyent/node/wiki/modules#wiki-tcp Un résumé très rapide =>
Il existe un module npm pour créer une requête semblable à une boucle, npm curlrequest
.
Étape 1: $npm i -S curlrequest
Étape 2: dans votre fichier de noeud
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, npm curlrequest
Utiliser le module request npm et after call
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.
});
Utilisez également le module winston logger ou le fichier console.log simple, puis exécutez votre application comme suit:
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 console.log
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). Possède également des fonctionnalités intéressantes telles que l'analyse des URL et des paramètres, l'intégration d'authentification, la prise en charge du cache, etc.
Par exemple, si vous créez un objet client, faites une demande:
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 enregistre 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 retournera un Promise object, vous devez donc manipuler avec then
et catch
quoi faire avec le résultat.
reqclient
est disponible avec npm, vous pouvez installer le module avec: npm install reqclient
.
J'ai eu un problème pour envoyer POST des données à la base de données en nuage d'IOT RaspberryPi, mais après des heures, j'ai réussi à tout comprendre.
J'ai utilisé la commande Invite 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"}'
L'invite de commande montrera les problèmes - mauvais nom d'utilisateur/mot de passe; mauvaise demande etc.
- base de données URL/emplacement du serveur (j'ai utilisé une simple base de données Cloudant libre et gratuite) -- utilisateur est le nom d'utilisateur de la partie authentification: DELETE) - H type de contenu - Cloudant concerne la base de données de documents, où le JSON est utilisé -- contenu de données lui-même trié au format JSON
J'ai fini par utiliser la bibliothèque grunt-Shell .
Ici est ma source Gist pour ma tâche Grunt entièrement mise en œuvre destinée à quiconque envisage de 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 eu après des heures passées à essayer de faire fonctionner une requête HTTP dans Node. Je pouvais en avoir un en Ruby et Python, mais je ne répondais pas aux exigences de ce projet.
Request npm module Le nœud Request moulde est bon à utiliser, il possède des options de paramétrage pour les requêtes get/post et est également largement utilisé dans les environnements de production.
Vous voudrez peut-être essayer d'utiliser quelque chose comme ça
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 utiliser request npm module . Super simple à utiliser . Request est conçu pour être le moyen le plus simple possible de passer 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.
});
Vous pouvez essayer d'utiliser l'application Chrome de POSTMAN pour votre demande et générer du code de noeud js à partir de là.