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.
URLetURLSearchParamspour 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.
Décomposer une URL
Écrivez
decomposer(texte)qui renvoie{ schema, hote, port, chemin, params, fragment }:schemasans 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 }Construire une URL de recherche
Écrivez
urlRecherche(base, filtres)qui ajoute àbaseles filtres non vides : chaque propriété dont la valeur n’est niundefined, ninull, 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 }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
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
Que renvoie new URL(“https://x.fr/?n=5”).searchParams.get(“n”) ?
- 5 (nombre)
- "5" (chaîne)
- undefined
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
- Méthodes et codes de statut18 min
- Concevoir une API REST : ressources, URL et pagination18 min
- Corps JSON, validation et format des erreurs18 min
- En-têtes essentiels : cache, CORS et authentification20 min
- Assembler un routeur d'API minimal20 min