Le protocole HTTP : requêtes, réponses et URL

Première leçon du cours HTTP et API REST, en accès libre : environ 16 minutes, 3 exercices et 3 questions de quiz. C'est la leçon de base du catalogue ; dans l'espace étudiant, elle est réécrite pour ton profil.

Objectifs

  • Décrire l'échange requête/réponse et la structure d'un message HTTP
  • Décomposer une URL (schéma, hôte, port, chemin, paramètres, fragment)
  • Manipuler URL et URLSearchParams en JavaScript

Requête et réponse HTTPStructure d'une URLEn-têtes HTTP

Le protocole HTTP : requêtes, réponses et URL

HTTP (HyperText Transfer Protocol) est le langage commun du web : navigateurs, applications mobiles, scripts d’analyse de données et serveurs l’utilisent pour échanger des ressources. Le principe : un client envoie une requête, un serveur renvoie une réponse.

HTTP est sans état : le serveur ne se souvient pas, par le protocole, des requêtes précédentes. Chaque requête doit contenir tout ce qu’il faut pour être traitée (identité via un jeton ou un cookie, paramètres…).

Anatomie d’un échange

GET /api/produits?categorie=velos&page=2 HTTP/1.1
Host: boutique.exemple.fr
Accept: application/json
Authorization: Bearer eyJhbGciOi...
  • Ligne de requête : méthode (GET), cible (chemin + paramètres), version.
  • En-têtes : métadonnées Nom: valeur (format accepté, authentification, langue…).
  • Corps (facultatif) : les données envoyées, par exemple en JSON pour un POST.
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Cache-Control: max-age=60

{"page":2,"produits":[{"id":12,"nom":"Vélo de ville"}]}
  • Ligne de statut : version, code de statut (200) et libellé.
  • En-têtes de réponse, puis le corps.

Les noms d’en-têtes sont insensibles à la casse (content-type = Content-Type).

Anatomie d’une URL

https://boutique.exemple.fr:8443/api/produits?categorie=velos&page=2#avis
└─┬─┘   └────────┬────────┘ └┬─┘└─────┬─────┘ └─────────┬────────┘ └┬─┘
schéma         hôte        port   chemin        chaîne de requête  fragment

Le fragment (#avis) reste dans le navigateur : il n’est jamais envoyé au serveur. Sans port explicite, https utilise 443 et http 80.

Manipuler les URL en JavaScript

L’objet standard URL (navigateur et Node.js) analyse une URL sans expression régulière fragile :

const url = new URL("https://boutique.exemple.fr/api/produits?categorie=velos&page=2#avis");
url.protocol;                        // "https:"
url.hostname;                        // "boutique.exemple.fr"
url.pathname;                        // "/api/produits"
url.searchParams.get("page");        // "2" (toujours une chaîne)
url.hash;                            // "#avis"

// URL relative résolue par rapport à une base
new URL("../contact", "https://exemple.fr/blog/article").href; // "https://exemple.fr/contact"

Pour construire une chaîne de requête, URLSearchParams encode les caractères spéciaux :

const params = new URLSearchParams({ q: "vélo & casque", tri: "prix" });
params.append("tag", "urbain");
params.toString(); // "q=v%C3%A9lo+%26+casque&tri=prix&tag=urbain"

const url2 = new URL("https://api.exemple.fr/recherche");
url2.search = params.toString();

Sans encodage, le & de « vélo & casque » couperait le paramètre en deux. Concaténer des chaînes à la main est une source classique de bugs… et de failles.

HTTPS et versions

HTTPS est HTTP chiffré par TLS : confidentialité, intégrité et authentification du serveur. C’est aujourd’hui la norme, indispensable dès qu’il y a des données personnelles ou des jetons.

HTTP/1.1, HTTP/2 (multiplexage) et HTTP/3 (sur QUIC) changent la façon de transporter les messages, mais la sémantique reste identique : mêmes méthodes, mêmes statuts, mêmes en-têtes. Ce cours s’applique donc à toutes les versions.

À retenir

  • Requête = méthode + cible + en-têtes + corps ; réponse = statut + en-têtes + corps.
  • URL et URLSearchParams pour lire et construire les URL.
  • Le fragment ne part pas au serveur ; HTTPS partout.

Exercices

Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.

  1. CodeDifficulté 1JavaScript dans le navigateur2 indices

    Décomposer une URL

    Écrivez decomposer(texte) qui renvoie { schema, hote, port, chemin, params, fragment } :

    • schema sans le : ("https") ;
    • port : le port explicite en nombre, sinon le port par défaut (443 pour https, 80 pour http) ;
    • params : un objet { nom: valeur } (dernière valeur si répétée) ;
    • fragment : sans le #, chaîne vide si absent.
    function decomposer(texte) {
      const url = new URL(texte);
      // TODO
    }
  2. CodeDifficulté 2JavaScript dans le navigateur2 indices

    Construire une URL de recherche

    Écrivez urlRecherche(base, filtres) qui ajoute à base les filtres non vides : chaque propriété dont la valeur n’est ni undefined, ni null, ni "" ; une valeur tableau produit un paramètre répété. Les clés sont ajoutées par ordre alphabétique pour obtenir des URL stables (utile pour le cache). Renvoie la chaîne de l’URL.

    function urlRecherche(base, filtres) {
      // TODO
    }
  3. QCMDifficulté 11 indice

    Que reçoit le serveur ?

    Le navigateur demande https://exemple.fr/doc?page=3#section-2. Quelle partie n’est pas envoyée au serveur ?

    • Le chemin /doc
    • La chaîne de requête ?page=3
    • Le fragment #section-2
    • L'hôte exemple.fr

Quiz de fin de leçon

  1. Que signifie « HTTP est sans état » ?

    • Le serveur ne peut rien stocker
    • Chaque requête est traitée indépendamment des précédentes par le protocole
    • Les réponses n'ont pas de code de statut
  2. Que renvoie new URL(“https://x.fr/?n=5”).searchParams.get(“n”) ?

    • 5 (nombre)
    • "5" (chaîne)
    • undefined
  3. Qu’est-ce qui change entre HTTP/1.1 et HTTP/2 ?

    • Les méthodes et les codes de statut
    • La façon de transporter les messages (multiplexage), pas leur sémantique
    • Le format des URL

La suite du cours

  1. Méthodes et codes de statut18 min
  2. Concevoir une API REST : ressources, URL et pagination18 min
  3. Corps JSON, validation et format des erreurs18 min
  4. En-têtes essentiels : cache, CORS et authentification20 min
  5. Assembler un routeur d'API minimal20 min

HTTP et API REST · Intermédiaire · 3 h 50