CyberSDF

Reprenez la main sur votre numérique

Comprendre HTTP : requêtes, réponses et codes de statut

Boîtier de mesure réseau en aluminium avec câble Ethernet branché et voyant ambre.

En bref : HTTP décrit l’échange entre un client, souvent un navigateur, et un serveur. Pour comprendre ce qui se passe, lisez la méthode et la cible de la requête, puis le code de statut et les en-têtes de la réponse. curl permet d’observer cet échange sans interface graphique.

Sommaire
  1. Une requête indique ce que le client demande
  2. Le corps de requête porte les données envoyées
  3. La réponse donne d’abord un statut
  4. Les en-têtes expliquent le traitement
  5. Observer l’échange avec curl
  6. Passer du symptôme au contrôle
  7. Le statut décrit l’échange, pas le métier

HTTP n’est pas le contenu d’une page. C’est le protocole qui organise la demande d’une ressource et la réponse du serveur. Le navigateur envoie une requête, le serveur renvoie une réponse, puis le navigateur interprète la représentation reçue. La RFC 9110 sur les sémantiques HTTP décrit les règles communes aux clients, serveurs et intermédiaires.

Une requête indique ce que le client demande

Une requête commence par une méthode, une cible et une version de protocole. Elle peut ensuite contenir des en-têtes, puis un corps quand l’opération transmet des données.

GET /documentation HTTP/1.1
Host: example.com
Accept: text/html

GET demande une représentation de la ressource. /documentation est la cible dans cet exemple. Host indique le nom du serveur visé et Accept exprime le type de contenu que le client sait recevoir. La ligne HTTP/1.1 décrit la syntaxe de l’échange, pas la version de la page demandée.

Les méthodes courantes ont un rôle distinct. GET lit, POST transmet une nouvelle donnée ou demande une action, PUT remplace une représentation, PATCH la modifie partiellement et DELETE demande sa suppression. Le serveur peut refuser une méthode qui n’est pas prévue pour la ressource.

Le corps de requête porte les données envoyées

Un formulaire peut envoyer ses champs dans le corps d’une requête POST. Les en-têtes disent comment interpréter ces octets.

POST /contact HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded

name=Camille&format=html

Content-Type décrit le format du corps. Avec du JSON, l’en-tête devient généralement application/json et le corps suit cette syntaxe. Une donnée sensible ne doit pas être copiée dans un terminal partagé ni dans une commande conservée par l’historique du shell.

La réponse donne d’abord un statut

En HTTP/1.1, la première ligne d’une réponse indique la version et un nombre à trois chiffres ; elle peut aussi comporter une courte raison lisible. HTTP/2 et HTTP/3 conservent les mêmes sémantiques de statut, mais transmettent leurs messages dans une autre syntaxe que cette ligne textuelle.

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1842

Le nombre est le code de statut. Il résume le résultat de la requête. Les en-têtes qui suivent précisent le type, la taille, la mise en cache, une nouvelle adresse ou les conditions d’accès. Le corps contient ensuite la représentation, par exemple du HTML ou du JSON.

2xx : le serveur a traité la demande

Code Signification pratique À regarder ensuite
200 OK La demande a abouti et une représentation peut être fournie. Le type indiqué par Content-Type et le contenu reçu.
201 Created Une ressource a été créée. L’en-tête Location quand le serveur donne sa nouvelle adresse.
204 No Content La demande a abouti sans contenu à renvoyer. Les en-têtes, car il n’y a pas de document à afficher.
206 Partial Content Une partie de la représentation est renvoyée. Content-Range et la demande de plage.

3xx : le client doit tenir compte d’une autre représentation

301 Moved Permanently et 308 Permanent Redirect indiquent un changement durable d’adresse. 302 Found et 307 Temporary Redirect décrivent un déplacement temporaire. Pour les variantes 307 et 308, la méthode et le corps doivent être conservés lors du suivi ; cette précision compte pour un POST. 304 Not Modified ne fournit pas de corps : le client peut réutiliser une représentation conservée si ses conditions de cache le permettent.

4xx : la requête ne peut pas être satisfaite telle quelle

Code Ce qu’il signale Premier contrôle
400 Bad Request La syntaxe ou les données de la requête sont invalides. La cible, les paramètres et le format envoyé.
401 Unauthorized Une authentification est nécessaire ou invalide. Le mécanisme d’authentification demandé par le serveur.
403 Forbidden Le serveur refuse l’accès à la ressource. Les droits et la règle d’accès, pas seulement l’identifiant.
404 Not Found Le serveur ne trouve pas la ressource correspondant à la cible demandée. L’URL exacte, le chemin et le routage du serveur.
405 Method Not Allowed La ressource existe mais la méthode n’est pas acceptée. L’en-tête Allow et la méthode attendue.
429 Too Many Requests Le client a envoyé trop de requêtes dans une période donnée, selon la définition de la RFC 6585. Retry-After et la cadence d’appel.

5xx : le traitement a échoué côté serveur

500 Internal Server Error désigne une erreur générale du serveur. 502 Bad Gateway signifie qu’un serveur agissant comme passerelle a reçu une réponse invalide d’un service en amont. 503 Service Unavailable indique une indisponibilité temporaire ou une surcharge ; l’en-tête Retry-After peut préciser quand réessayer. 504 Gateway Timeout signifie que la passerelle n’a pas reçu à temps la réponse du service en amont.

Les en-têtes expliquent le traitement

Un code seul ne raconte pas tout l’échange. Ces en-têtes reviennent souvent :

Le corps doit être lu avec le type annoncé. Une réponse JSON ne se traite pas comme une page HTML, même si les deux arrivent dans une réponse HTTP réussie.

Observer l’échange avec curl

Le manuel officiel de curl documente les options utilisées ci-dessous. La commande suivante demande une page en HTTP/1.1, ne conserve pas son corps dans un fichier et imprime quelques mesures utiles :

curl -sS --http1.1 --max-time 30 \
  -o /dev/null \
  -w 'status=%{http_code} http_version=%{http_version} content_type=%{content_type} bytes=%{size_download} time_total=%{time_total}\n' \
  https://example.com/

Mesure exécutée le 17 septembre 2026 sur https://example.com/ :

status=200 http_version=1.1 content_type=text/html bytes=559 time_total=0.083967

Le nombre 200 vient de %{http_code}, 1.1 de %{http_version}, text/html de %{content_type}, et 559 de %{size_download}. La durée 0.083967 est exprimée en secondes par %{time_total}. Elle dépend du moment, du réseau et du serveur.

Pour voir les en-têtes et le corps ensemble, utilisez -i. Pour demander seulement les en-têtes avec la méthode HEAD, utilisez -I. Pour suivre une redirection et afficher l’adresse finale, ajoutez -L. Ces options ne répondent pas à la même question : -I ne vérifie pas le téléchargement du corps et -L masque le premier statut si vous ne regardez pas toute la sortie.

Passer du symptôme au contrôle

Un diagnostic commence par le statut qui revient, puis vérifie les éléments adaptés :

Pour les commandes de terminal, la page consacrée au terminal Linux rappelle les bases utiles. Si le problème touche la connexion de la machine plutôt que la réponse d’un serveur web, utilisez le diagnostic réseau sous Linux. Pour comparer un programme à installer selon vos contraintes, consultez la grille de choix d’un logiciel.

Le statut décrit l’échange, pas le métier

Un code HTTP confirme le résultat de la communication entre le client et le serveur ; il ne dit pas si une action métier a produit la valeur attendue. Pour l’interpréter correctement, associez toujours le statut aux en-têtes, au type de contenu et au corps réellement reçus.

La syntaxe complète de HTTP/1.1 est détaillée dans la RFC 9112. Elle devient utile quand vous devez lire les lignes, les délimitations du corps ou les échanges entre intermédiaires.