164 votes

L'équivalent de cURL en 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 renvoyer la réponse au client).

En PHP, j'aurais utilisé cURL pour faire cela. Quelle est la meilleure pratique dans Node ?

14 votes

http.request ...

0 votes

Le problème de toutes ces solutions est qu'elles nécessitent le contrôle des cors !

110voto

Dan Grossman Points 31514

Consultez la documentation du module HTTP pour un exemple complet :

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

11 votes

Il convient également de souligner l'existence d'une bibliothèque d'enveloppes très populaire. request.js github.com/mikeal/request

2 votes

La demande http est asynchrone, curl est synchrone.

3 votes

@WHK telle est la nature de node.js

79voto

Jeremy Banks Points 32470

Le site 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();

14 votes

Il s'agit d'un niveau très bas comparé au comportement de boucle que le PO a demandé.

1 votes

A tous : De nos jours, utiliser request - npmjs.com/package/requête - et upvotez la réponse de Nitish, ci-dessous, qui est la meilleure réponse en 2018.

5 votes

Bienvenue dans la réalité : la demande a été dépréciée, voir github.com/request/request/issues/3142 Il me semble que les opérations de "bas niveau" ont plus de potentiel que cela, parce que ce n'est pas du tout bas, c'est du BASIC.

29voto

JCM Points 1259

Puisque cela ressemble à node-curl est mort, je l'ai bifurqué, renommé, et modifié pour qu'il soit plus proche de curl et compile 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 il n'y en aura probablement jamais).

Il est encore en phase alpha, mais cela va bientôt changer, et toute aide est appréciée.

Il est maintenant possible d'utiliser Easy gérer directement 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 maintenant stable !

0 votes

J'ai essayé d'installer à la fois node-curl et node-libcurl, mais les deux me donnent le même message : "Impossible de trouver le fichier d'en-tête de curl". C'est pendant le node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuild étape. Des idées ?

0 votes

@GreatBigBore vous devez installer le paquet libcurl devel sur votre machine. Si vous utilisez debian par exemple, vous pouvez l'installer avec $ apt-get install libcurl4-openssl-dev

1 votes

Pouvez-vous utiliser le -L d'une manière ou d'une autre ?

8voto

Brad Dickason Points 357

Les exemples ci-dessus fonctionnent mais ne vont pas jusqu'à traiter un exemple concret (c'est-à-dire lorsque vous traitez des données arrivant en plusieurs morceaux). Une chose dont vous devez être sûr est que vous avez un gestionnaire "on chunk" qui pousse les données dans un tableau (la façon la plus rapide de le faire en JS) et un gestionnaire "on end" qui les joint tous ensemble afin que vous puissiez les retourner.

C'est particulièrement nécessaire lorsque vous travaillez avec de grosses requêtes (5000+ lignes) et que le serveur vous envoie un grand nombre de données.

Voici un exemple dans un de mes programmes (coffeescript) : https://gist.github.com/1105888

7voto

Alfred Points 32190

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X