230 votes

Requête HTTP GET en Node.js Express

Comment puis-je faire une requête HTTP à partir de Node.js ou Express.js ? J'ai besoin de me connecter à un autre service. J'espère que l'appel est asynchrone et que le callback contient la réponse du serveur distant.

0 votes

Dans Node.js 18, l'API fetch est disponible par défaut sur la portée globale. stackoverflow.com/questions/6158933/

244voto

bryanmac Points 22834

Voici un extrait du code d'un de mes échantillons. Il est asynchrone et renvoie un objet JSON. Il peut faire n'importe quelle forme de requête GET.

Notez qu'il existe des méthodes plus optimales (juste un exemple) - par exemple, au lieu de concaténer les morceaux, vous les mettez dans un tableau et vous les joignez, etc... Avec un peu de chance, cela vous met sur la bonne voie :

const http = require('http');
const https = require('https');

/**
 * getJSON:  RESTful GET request returning JSON object(s)
 * @param options: http options object
 * @param callback: callback to pass the results JSON object(s) back
 */

module.exports.getJSON = (options, onResult) => {
  console.log('rest::getJSON');
  const port = options.port == 443 ? https : http;

  let output = '';

  const req = port.request(options, (res) => {
    console.log(`${options.host} : ${res.statusCode}`);
    res.setEncoding('utf8');

    res.on('data', (chunk) => {
      output += chunk;
    });

    res.on('end', () => {
      let obj = JSON.parse(output);

      onResult(res.statusCode, obj);
    });
  });

  req.on('error', (err) => {
    // res.send('error: ' + err.message);
  });

  req.end();
};

On l'appelle en créant un objet options comme :

const options = {
  host: 'somesite.com',
  port: 443,
  path: '/some/path',
  method: 'GET',
  headers: {
    'Content-Type': 'application/json'
  }
};

Et en fournissant une fonction de rappel.

Par exemple, dans un service, je demande le module REST ci-dessus et je fais ensuite ceci :

rest.getJSON(options, (statusCode, result) => {
  // I could work with the resulting HTML/JSON here. I could also just return it
  console.log(`onResult: (${statusCode})\n\n${JSON.stringify(result)}`);

  res.statusCode = statusCode;

  res.send(result);
});

UPDATE

Si vous êtes à la recherche de async / await (linéaire, sans callback), les promesses, le support de la compilation et l'intellisense, nous avons créé un client HTTP et REST léger qui correspond à ce projet :

Microsoft typed-rest-client

0 votes

@bryanmac pouvez-vous s'il vous plaît envoyer/ajoutez l'échantillon complet ?

1 votes

@bryanmac avec votre permission je voudrais utiliser ce code grunt plugin que je suis en train de construire. Je ne sais pas quand, mais il sera mis en source ouverte une fois terminé.

0 votes

@JeffH - pas de problème. pas de science de la pierre ici, des appels http standard :)

109voto

maerics Points 47743

Essayez d'utiliser le simple http.get(options, callback) fonction dans node.js :

var http = require('http');
var options = {
  host: 'www.google.com',
  path: '/index.html'
};

var req = http.get(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));

  // Buffer the body entirely for processing as a whole.
  var bodyChunks = [];
  res.on('data', function(chunk) {
    // You can process streamed parts here...
    bodyChunks.push(chunk);
  }).on('end', function() {
    var body = Buffer.concat(bodyChunks);
    console.log('BODY: ' + body);
    // ...and/or process the entire body here.
  })
});

req.on('error', function(e) {
  console.log('ERROR: ' + e.message);
});

Il existe également une http.request(options, callback) fonction qui vous permet de spécifier la méthode de demande et d'autres détails de la demande.

0 votes

Où est le contenu de la réponse du serveur que le PO a demandé ?

0 votes

Merci pour la mise à jour. On dirait qu'il y a besoin d'un gestionnaire de fin pour concaténer les morceaux. Ce qui revient en gros à la réponse de @bryanmac ?

0 votes

@DanDascalescu : oui, si vous voulez traiter le corps dans son ensemble (ce qui est probable), vous voulez probablement le mettre en mémoire tampon et le traiter à la 'fin'. Je vais aussi mettre à jour ma réponse pour être plus complet.

73voto

emostar Points 4662

Demande y Superagent sont d'excellentes bibliothèques à utiliser.

note : la demande est déprécié à utiliser à vos risques et périls !

Utilisation de request :

var request=require('request');

request.get('https://someplace',options,function(err,res,body){
  if(err) //TODO: handle err
  if(res.statusCode === 200 ) //etc
  //TODO Do something with response
});

7 votes

Devrait-il s'agir de res.statusCode === 200 dans le second if ? )

1 votes

Quelle est la variable d'options ? juste passer une variable indéfinie ? j'en doute

37voto

ranm8 Points 226

Vous pouvez également utiliser Requestify un client HTTP vraiment cool et très simple que j'ai écrit pour nodeJS et qui supporte la mise en cache.

Il suffit de faire ce qui suit pour une demande par la méthode GET :

var requestify = require('requestify');

requestify.get('http://example.com/api/resource')
  .then(function(response) {
      // Get the response body (JSON parsed or jQuery object for XMLs)
      response.getBody();
  }
);

1 votes

"Essayez cet autre outil" n'est pas une réponse acceptable si le jeu d'outils existant est suffisant.

7 votes

Bien sûr, une autre solution est toujours une bonne chose.

9voto

Cosmic Flame Points 1853

Unirest est la meilleure bibliothèque que j'ai trouvée pour faire des requêtes HTTP à partir de Node. Elle vise à être un framework multiplateforme, donc apprendre comment elle fonctionne sur Node vous servira si vous avez besoin d'utiliser un client HTTP sur Ruby, PHP, Java, Python, Objective C, .Net ou Windows 8 également. Pour autant que je puisse dire, les bibliothèques unirest sont principalement soutenues par des clients HTTP existants (par exemple, sur Java, le client HTTP Apache, sur Node, Bibliothèque des demandes de Mikeal ) - Unirest ne fait que mettre une plus belle API sur le dessus.

Voici quelques exemples de code pour Node.js :

var unirest = require('unirest')

// GET a resource
unirest.get('http://httpbin.org/get')
  .query({'foo': 'bar'})
  .query({'stack': 'overflow'})
  .end(function(res) {
    if (res.error) {
      console.log('GET error', res.error)
    } else {
      console.log('GET response', res.body)
    }
  })

// POST a form with an attached file
unirest.post('http://httpbin.org/post')
  .field('foo', 'bar')
  .field('stack', 'overflow')
  .attach('myfile', 'examples.js')
  .end(function(res) {
    if (res.error) {
      console.log('POST error', res.error)
    } else {
      console.log('POST response', res.body)
    }
  })

Vous pouvez passer directement à la documentation de Node. aquí

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