web-dev-qa-db-fra.com

cURL équivalent dans Node.js?

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?

117
slifty

Voir la documentation du module HTTP pour un exemple complet:

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

79
Dan Grossman

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();
64
Jeremy Banks

Comme il semblerait que node-curl soit mort, je l'ai créé, renommé et modifié pour être plus fluide et compiler sous Windows.

node-libcurl

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!

23
JCM

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)
  }
})
22
Nitish Agarwal

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

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

8
Brad Dickason

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.

7
warfares
7
Alfred

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

4
Laksh Goel

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 

2
D M Patel

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.

1
Mariano Ruiz

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

1
Rudolfs

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.

1

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.

1
Indrani Sen

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'));
});
0
Gautam Anand

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

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à. 

0
Ravi Teja