Node

Les requêtes HTTP

Comprendre les requêtes HTTP et comment les gérer en NodeJS

Avant de continuer notre formation sur NodeJS il convient de comprendre ce qu'est une requête HTTP (ou Hypertext Transfer Protocol).

A chaque fois que vous tentez d'accéder à une page web vous réalisez une requête HTTP. Cette requête va contacter l'hébergeur de la page que vous ciblez et va attendre une réponse qui permettra l'affichage du site. Il est important de comprendre que lorsque vous cherchez à accéder à un site, pour chaque fichier requis vous réaliserez une requête HTTP pour obtenir l'information. Les gros sites pouvant rapidement atteindre des masses critiques de requêtes il est important pour eux d'optimiser les appels HTTP au maximum afin de gagner en performance.

Dans le cas d'une API le nombre d'appel HTTP est censé être minime, voir unique.

Structure d'une requête HTTP

Maintenant que nous comprenons un peu mieux à quoi sert une requête HTTP il est important de voir comment elle est structurée. Il ne s'agit pas ici d'un cours approfondi sur HTTP aussi nous passerons en revue les éléments les plus importants du protocole HTTP.

Types de requête

Lorsque vous réalisez une requête HTTP elle possède un type. Par défaut il s'agit d'une requête GET. Elle permet d'obtenir des informations en les ramenant au client. Mais il existe de nombreux autres types, dont voici une liste des plus fréquemment rencontrés.

  • POST : Il s'agit de la requête par défaut lorsque l'on veut envoyer des données au serveur, lors d'une création ou la soumission d'un formulaire par exemple.
  • DELETE : La requête utilisée pour indiquer la supression/destruction de données.
  • PATCH : Requête utile en cas de modification de données.
  • HEAD : permet de ne récupérer que les informations d'en-tête et donc de limiter la taille de la réponse. Utile lorsque l'on souhaite faire des vérifications avant une requête GET par exemple pour connaître la taille de la page en amont.

Code HTTP

Une fois la réponse reçue elle est souvent accompagnée d'un code qui permet de rapidement savoir la nature de la réponse. Vous connaissez sûrement l'un des plus connus: le code 404 Not Found. Les codes HTTP se décomposent d'abord avec leur chiffre de centaine qui correspond chacun à un type. Par exemple le 4 de 400 ici correspond à une erreur client. Et ensuite on incrémente un nombre pour avoir du détal, ici 04 pour dire ressource non trouvée (not found).

CodeSignificationDescription
200OKLa requête a été traitée avec succès. Cela signifie généralement que la requête a réussi et que la réponse contient les données demandées.
201CreatedLa requête a été traitée avec succès, et une nouvelle ressource a été créée. Ceci est couramment utilisé pour les requêtes POST.
204No ContentLa requête a réussi, mais il n'y a pas de contenu à renvoyer. Par exemple, après une suppression (DELETE), la réponse peut être vide.
400Bad RequestLa requête est mal formulée ou manque d'informations nécessaires. Ce code indique généralement une erreur du côté du client.
401UnauthorizedLa requête nécessite une authentification. Ce code est souvent renvoyé lorsqu'une API requiert une clé d'API ou un jeton d'authentification.
403ForbiddenLe serveur comprend la requête, mais il refuse de l'exécuter. Cela peut être dû à des permissions insuffisantes.
404Not FoundLa ressource demandée n'a pas été trouvée sur le serveur. Cela est couramment utilisé pour indiquer que l'URL ou l'endpoint n'existe pas.
405Method Not AllowedLa méthode HTTP utilisée (par exemple, GET, POST, PUT, DELETE) n'est pas autorisée pour la ressource spécifiée.
500Internal Server ErrorIl y a une erreur côté serveur. Cela signifie que quelque chose s'est mal passé, mais le serveur ne peut pas donner plus de détails.

Vous trouverez le détail des codes HTTP ici.

Réaliser une requête HTTP en NodeJS

Le but d'un serveur NodeJS est de pouvoir répondre à des requêtes HTTP. Pour ce faire nous allons utiliser le package natif de NodeJS http. Ce package nous permet de créer un serveur HTTP et de répondre à des requêtes. Nous avons déjà vu comment créer le serveur et l'écouter. Maintenant j'aimerai qu'il soit capable de créer des réponses en fonction du type de requête.

Ce package étant natif à NodeJS il n'est pas nécessaire de l'installer.

Pour ce faire nous allons récupérer l'objet req qui est passé en paramètre de notre callback de création de serveur. Cet objet contient de nombreuses informations sur la requête, dont la méthode utilisée. Nous allons donc vérifier la méthode de la requête et renvoyer une réponse en fonction via l'objet res.

import http from 'http';

// Création du serveur HTTP
const server = http.createServer((req, res) => {
  // Vérification de la méthode de la requête
  if (req.method === 'GET') {
    // Définition du code de statut de la réponse à 200 (OK)
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    // Envoi de la réponse
    res.end('Requête GET réussie avec code 200\n');
  } else {
    // Si la méthode de la requête n'est pas GET, renvoyer un code 405 (Method Not Allowed)
    res.writeHead(405, { 'Content-Type': 'text/plain' });
    res.end('Méthode non autorisée\n');
  }
});

// Démarrage du serveur sur le port 3000
server.listen(3000, () => {
  console.log("Serveur en cours d'écoute sur le port 3000...");
});

Note: Une fonction callback est une fonction qui est passée en argument à une autre fonction et qui est ensuite exécutée à un moment donné, généralement après que cette fonction ait terminé son traitement. En d'autres termes, c'est une fonction qui "attend" d'être appelée une fois qu'une tâche asynchrone (comme une requête HTTP ou une opération de lecture de fichier) est terminée.