Qu'est-ce qu'une requête HTTP ?
Une requête HTTP (HyperText Transfer Protocol) est le message qu'un client envoie à un serveur pour demander une page ou des données. La réponse revient dans un format tout aussi régulier.
Savoir lire une requête et sa réponse est le premier geste de quiconque construit ou dépanne une application web. Quand une page ne s'affiche pas, c'est là qu'on cherche.
À la fin de cette leçon
Remarque
Je peux lire une requête HTTP et sa réponse.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Client | le programme qui envoie une requête | un navigateur |
| Serveur | le programme qui attend les requêtes et y répond | |
| Méthode | le verbe de la requête : ce qu'on demande de faire | GET |
| En-tête | une ligne « nom : valeur » qui décrit la requête ou la réponse | Host: api:3000 |
| Corps | les données transportées après les en-têtes | |
| Code de statut | un nombre à trois chiffres qui dit comment la requête s'est passée | 200 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une requête a trois parties
Une requête commence par une ligne : la méthode, le chemin et la version du protocole. Viennent ensuite les en-têtes, à raison d'une ligne chacun. Une ligne vide termine les en-têtes.
Le corps suit, s'il y en a un. Une lecture n'en a presque jamais. Un ajout y met les données à envoyer.
Exemple : une requête qui ajoute un livre
POST /livres HTTP/1.1
Host: api:3000
Content-Type: application/json
{"titre": "Nana", "auteur": "Emile Zola", "annee": 1880}Préparer le catalogue de la bibliothèque
Dans ce laboratoire, un serveur nommé PostgREST met chaque table de la base derrière une adresse web. Le terminal contient psql pour la base et curl pour envoyer des requêtes.
Le Run suivant crée la table livres avec cinq livres. Il peut être relancé pour repartir de zéro. Attendez une seconde ensuite, le temps que le serveur relise la base.
Créer la table des livres
PGPASSWORD=shop psql -q -h db -U shop -c "set client_min_messages to warning; drop table if exists livres; create table livres (id serial primary key, titre text not null unique, auteur text not null, annee integer not null, exemplaires integer not null default 1 check (exemplaires >= 0), disponible boolean not null default true, resume text); insert into livres (titre, auteur, annee, exemplaires, disponible) values ('Germinal', 'Emile Zola', 1885, 3, true), ('Candide', 'Voltaire', 1759, 0, false), ('Madame Bovary', 'Gustave Flaubert', 1857, 2, true), ('La Peste', 'Albert Camus', 1947, 4, true), ('Bel-Ami', 'Guy de Maupassant', 1885, 1, true); notify pgrst, 'reload schema'"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Voir la requête que curl envoie
curl -s -v -o /dev/null "http://api:3000/livres?id=eq.1" 2>&1 | grep -E '^> (GET|Host)'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une réponse a la même forme
Le serveur répond avec une ligne de statut, des en-têtes, une ligne vide, puis le corps. La ligne de statut donne la version, le code et un mot : HTTP/1.1 200 OK.
Le code est ce qu'un programme lit en premier. Il dit si la requête a réussi, sans qu'il faille lire le corps.
Exemple : les parties d'une réponse
| Partie | Exemple | Ce qu'elle dit |
|---|---|---|
| Ligne de statut | HTTP/1.1 200 OK | La requête a réussi |
| En-tête | Content-Type: application/json | Le corps est du JSON |
| Ligne vide | (rien) | Les en-têtes sont finis |
| Corps | Une liste de livres | Les données demandées |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Lire le code de statut seul
curl -s -o /dev/null -w "%{http_code}\n" "http://api:3000/livres?id=eq.1"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire la ligne de statut
curl -s -D - -o /dev/null "http://api:3000/livres" | head -n 1Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire l'en-tête Content-Type
curl -s -D - -o /dev/null "http://api:3000/livres" | grep -i '^content-type'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire le corps pour un seul livre
curl -s -w "\n" "http://api:3000/livres?id=eq.1"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup pensent que l'adresse seule dit ce que le serveur fait. C'est faux : c'est la méthode et l'adresse ensemble. GET /livres lit les livres, DELETE /livres les supprime. Lisez toujours les deux avant d'envoyer.
Une adresse inconnue donne un code 404
Le serveur ne devine pas. Si le chemin ne désigne aucune table, il répond 404, qui veut dire « introuvable ».
Le code 404 et le code 200 ne se lisent pas dans le corps mais dans la ligne de statut. Essayez avec une table qui n'existe pas.
Demander une table qui n'existe pas
curl -s -o /dev/null -w "%{http_code}\n" "http://api:3000/rayons"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.