É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?

109
demandé sur slifty 2011-07-25 20:13:01

17 réponses

Voir la documentation du module HTTP pour un exemple complet:

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

75
répondu Dan Grossman 2018-05-08 11:33:23

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();
60
répondu Jeremy Banks 2013-08-13 18:45:27

Depuis ressemble à node-curl est mort, je l'ai bifurqué, renommé et modifié pour être plus curl 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();

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!

20
répondu JCM 2016-05-19 23:54:16

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)
  }
})
19
répondu Nitish Agarwal 2016-01-08 13:53:34

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.
   }
})
12
répondu Aronis Mariano 2015-04-07 21:55:11

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

8
répondu Brad Dickason 2011-07-26 03:25:43
7
répondu Alfred 2011-07-25 17:25:24

Eh Bien, si vous avez vraiment besoin d'un curl équivalent, vous pouvez essayer node-curl

npm install node-curl

Vous devrez probablement ajouter libcurl4-gnutls-dev.

6
répondu warfares 2012-10-21 09:11:45

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

4
répondu Laksh Goel 2017-06-21 08:26:37

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.

1
répondu strawberryMarshmallow 2014-11-11 02:09:56

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.

1
répondu Mariano Ruiz 2016-10-22 15:35:30

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

1
répondu Rudolfs 2017-07-05 13:15:06

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.

1
répondu Indrani Sen 2018-05-08 13:05:30

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

1
répondu D M Patel 2018-06-18 11:56:33

, 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'));
});
0
répondu Gautam Anand 2016-04-11 18:53:41

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à

0
répondu Ravi Teja 2016-08-12 16:45:27

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.
});
0
répondu Rubin bhandari 2018-05-24 06:37:22