4 façons de faire des requêtes HTTP en Node.js

August 09, 2017
Rédigé par
Sam Agnew
Twilion

4-facons-requetes-http-node-js-banniere.png

L'envoi de requêtes HTTP est une fonctionnalité de base des langues modernes et l'une des premières choses que de nombreux devs apprennent. En ce qui concerne Node.js, il existe un grand nombre de solutions à cette problématique, qu’elles soient intégrées de base dans le langage ou créées par la communauté. Examinons quelques-unes des plus populaires.

Nous utiliserons L'API JSON de la NASA Image Astronomique du Jour, parce que l'espace, c’est juste trop cool.

Avant de commencer, assurez-vous que vous avez des versions à jour de Node.js et npm installées sur votre machine.

HTTP – la Bibliothèque Standard

Le module HTTP par défaut de la bibliothèque standard est le premier de notre palmarès.

L’avantage d’utiliser ce module est de ne pas avoir à installer de dépendances externes. L'inconvénient est qu'il n'est pas très convivial par rapport à d'autres solutions.

Le code suivant enverra une demande GET à l'API de la NASA et imprimera l'URL de l'image astronomique du jour ainsi qu'une explication :

const https = require('https');

https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', (resp) => {
  let data = '';

  // Un morceau de réponse est reçu
  resp.on('data', (chunk) => {
    data += chunk;
  });

  // La réponse complète à été reçue. On affiche le résultat.
  resp.on('end', () => {
    console.log(JSON.parse(data).explanation);
  });

}).on("error", (err) => {
  console.log("Error: " + err.message);
});

Une grande partie des fonctionnalités des modules HTTP et HTTPS sont plutôt bas niveau.

On reçoit la réponse par morceaux plutôt que de simplement fournir une fonction de rappel à exécuter dès que toutes les données sont reçues. On doit également analyser les données de réponse manuellement. C'est assez simple si elles sont formatées en JSON comme ici, mais ça reste une étape supplémentaire.

Un autre problème est que ce module ne supporte pas HTTPS par défaut, nous devons donc requérir le module HTTPS à la place si l'API que nous utilisons communique via HTTPS.

En définitive, pour les cas un peu complexes il faudra fournir un effort supplémentaire pour obtenir toutes les données que l’on veut mais c’est une bonne solution si l’on veut éviter d’ajouter des dépendances à son code ou que l’on a besoin des fonctionnalités bas niveau.

Axios

Axios est un client HTTP basé sur Promise pour le navigateur et pour node.js.

L'utilisation de Promises est bien pratique lorsque le code nécessite un enchaînement d'événements plus complexes. Écrire du code asynchrone peut être source de confusion, et Promises est l'une des nombreuses approches que l'on peut adopter face à cette problématique. Promises est même utilisés dans d'autres langages comme Swift.

Pour installer Axios à partir de npm, entrez la commande suivante dans votre terminal :

npm install axios@0.21.1

Le code suivant accomplira la même tâche d’affichage de l'URL et de l'explication de l'image astronomique du jour :

const axios = require('axios');

axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY')
  .then(response => {
    console.log(response.data.url);
    console.log(response.data.explanation);
  })
  .catch(error => {
    console.log(error);
  });

Axios gère même les réponses au format JSON par défaut. Plutôt pratique ! Vous pouvez aussi voir que la gestion des erreurs se fait avec .catch() puisque nous utilisons maintenant les Promises.

Vous pouvez même faire plusieurs requêtes simultanées avec axios.all si vous voulez obtenir l'image astronomique de deux jours différents en même temps par exemple :

var axios = require('axios');

axios.all([
  axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2017-08-03'),
  axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2017-08-02')
]).then(axios.spread((response1, response2) => {
  console.log(response1.data.url);
  console.log(response2.data.url);
})).catch(error => {
  console.log(error);
});

Coder en asynchrone peut facilement devenir complexe et désagréable à gérer, et la façon dont Axios aborde ce problème peut vraiment vous faciliter la vie à long terme.

SuperAgent

Tout comme Axios, SuperAgent est une autre bibliothèque populaire. Utilisée principalement pour effectuer des requêtes AJAX dans le navigateur, elle fonctionne également dans Node.js. Installez SuperAgent avec la commande suivante :

npm install superagent@6.1.0

Ce qui est pas mal avec SuperAgent, c'est les fonctions que l'on peut enchaîner sur des requêtes pour leur ajouter des paramètres, comme par exemple query(). Dans les exemples précédents, nous les avons simplement ajoutés manuellement dans l'URL, mais vous pouvez voir que SuperAgent fournit une fonction pour le faire :

const superagent = require('superagent');

superagent.get('https://api.nasa.gov/planetary/apod')
.query({ api_key: 'DEMO_KEY', date: '2017-08-02' })
.end((err, res) => {
  if (err) { return console.log(err); }
  console.log(res.body.url);
  console.log(res.body.explanation);
});

Tout comme avec Axios, vous n'avez pas à traiter vous-même la réponse en JSON, et ça aussi c’est cool.

Got

Got est une bonne option si vous voulez une bibliothèque plus légère. Elle est également utilisable avec les fonctions Twilio.

Là encore, installez Got avec npm :

npm install got@7.1.0

Tout comme Axios, Got travaille aussi avec les Promises. Le code suivant fera la même chose que dans les autres exemples :

const got = require('got');

got('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', { json: true }).then(response => {
  console.log(response.body.url);
  console.log(response.body.explanation);
}).catch(error => {
  console.log(error.response.body);
});

Got est parfait si vous voulez une petite bibliothèque qui est moins "lourde" que Request ou équivalent.

Conclusion

Nous n’avons pas couvert tous les cas mais vous connaissez maintenant la base de quelques-unes des bibliothèques HTTP les plus populaires de Node. Il existe également des bibliothèques telles que node-fetch qui porte la fonctionnalité fetch du navigateur vers le backend.

D'autres langages disposent d'une variété similaire de bibliothèques pour répondre à cette problématique. Vous pouvez faire la même chose en Swift, Python et Ruby. Vous pouvez aussi lire nos quickstarts Node.js pour mettre en pratique vos nouvelles compétences.

 

 

Valériane Venance est Developer Evangelist chez Twilio. Laissez lui un message à vvenance@twilio.com ou sur Twitter si vous avez codé un projet cool dont vous voulez discuter!