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 :
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 :
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 :
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 à [email protected] ou sur Twitter si vous avez codé un projet cool dont vous voulez discuter!