5 façons de faire des requêtes HTTP avec Node.js et Async/Await

March 19, 2020
Rédigé par
Sam Agnew
Twilion

5-facon-requetes-http-node-js-async-await

Nous avons vu ensemble dans un précédent article comment faire des requêtes HTTP avec Node.js. Il est temps d’apprendre à faire la même chose avec async/await !

Comme dans l'autre article, nous utiliserons l'API JSON "Astronomy Picture of the Day" de la NASA parce que l'espace, c’est toujours aussi cool!

Pour suivre ce tutoriel, assurez-vous d'avoir des versions actualisées de Node.js et npm installées sur votre machine.

HTTP - la bibliothèque standard

Commençons par le module HTTP par défaut sans Promises et async/await.

Son avantage est de n’ajouter aucune dépendance au projet, mais il est moins simple d’utilisation que d’autres solutions que nous verrons plus loin.

Ce code envoie une requête GET à l'API de la NASA et affiche l'URL de l'image astronomique du jour et son explication dans la console :

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);
});

La majorité des fonctionnalités des modules HTTP et HTTPS sont plutôt de 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.

Async/await n’étant pas disponible pour les requêtes HTTP effectuées avec cette bibliothèque, une approche pour faire face à cette problématique pourrait être d’utiliser des flux asynchrones.

Même si pour les cas un peu complexes il faudra fournir un effort supplémentaire pour lire toutes les données, HTTP 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.

Got

Got est un excellent choix si vous cherchez une bibliothèque légère. Elle est conçue pour être simple d’utilisation et peut également être utilisée par défaut dans Twilio Functions.

Installer Got avec npm :

npm install got@9.6.0

Parce que Got utilise Promises, vous verrez qu'il vous faut beaucoup moins de code pour faire la même chose que précédemment, tout en profitant des fonctionnalités async/await :

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

Cette bibliothèque n'analyse pas JSON par défaut, C’est pourquoi nous avons dû ajouter { json : true } comme argument de la requête.

Got est une option parfaite si vous voulez juste une bibliothèque facile à utiliser et légère.

Axios

Axios est un autre client HTTP basé sur Promises qui fonctionne aussi bien dans le navigateur que dans node.js.

Pour installer Axios avec npm, entrez la commande suivante dans votre terminal :

npm install axios@0.19.2

Le code suivant affichera l’URL et l’explication de la photo astronomique du jour :

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

Axios lui, gère le JSON par défaut, et ça aussi c’est cool.

On peut même faire des requêtes simultanées avec axios.all. Pour obtenir l’URL et la description de deux photos astronomiques en même temps :

const axios = require('axios');
 
(async () => {
  try {
        const [response1, response2] = await axios.all([
          axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2020-03-18'),
          axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2020-03-17')
        ]);
        console.log(response1.data.url);
        console.log(response1.data.explanation);
 
        console.log(response2.data.url);
        console.log(response2.data.explanation);
  } catch (error) {
        console.log(error.response.body);
  }
})();

SuperAgent

Tout comme Axios, SuperAgent est une autre librairie populaire. Utilisée principalement pour effectuer des requêtes asynchrones dans le navigateur, elle fonctionne également avec Node.js.

Installez SuperAgent avec la commande suivante :

npm install superagent@5.2.2

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 ajoutés manuellement dans l'URL, mais vous pouvez voir que SuperAgent fournit une fonction pour le faire :

const superagent = require('superagent');
 
(async () => {
  try {
        const queryArguments = {
          api_key: 'DEMO_KEY',
          date: '2020-03-18'
        }
 
        const response = await superagent.get('https://api.nasa.gov/planetary/apod').query(queryArguments)
        console.log(response.body.url);
        console.log(response.body.explanation);
  } catch (error) {
        console.log(error.response.body);
  }
})();

Tout comme avec Axios, vous n'avez pas à analyser vous-même la réponse de JSON quand vous utilisez SuperAgent.

node-fetch

node-fetch est un module léger qui porte la libraire du navigateur window.fetch à Node.js.

Comme avant, installez node-fetch avec ce qui suit :

npm install node-fetch@2.6.0

Les versions récentes de cette bibliothèque utilisant des Promises, nous sommes en mesure d'utiliser la syntaxe async/await avec elle également :

const fetch = require('node-fetch');
 
(async () => {
  try {
 
        const response = await fetch('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY')
        const json = await response.json()
 
        console.log(json.url);
        console.log(json.explanation);
  } catch (error) {
        console.log(error.response.body);
  }
})();

Cette librairie embarque une fonction pour convertir la réponse en JSON, mais elle ne le fait pas automatiquement comme le font Axios et SuperAgent.

C'est une excellente lib pour les personnes habituées à utiliser l'API Fetch du navigateur.

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.

Par ici si vous voulez apprendre à 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!