Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Concevoir les adresses d'une API REST

Après cette leçon: Je peux choisir l'adresse et la méthode qui conviennent à une action.

Leçon de 55 min6 commandesLab PostgreSQL et PostgREST : une base de données et une API REST dans le navigateur

Qu'est-ce qu'une API REST ?

Une API REST (REpresentational State Transfer) donne accès à des ressources, comme des livres ou des emprunts, par des adresses claires et quelques méthodes HTTP. Bien choisir ces adresses et ces méthodes rend une API facile à deviner et à utiliser.

Un développeur qui découvre l'API d'une bibliothèque devrait trouver l'adresse d'un livre sans lire un manuel entier.

À la fin de cette leçon

Remarque

Je peux choisir l'adresse et la méthode qui conviennent à une action.

Mots clés

MotCe que ça veut direExemple
Ressourceune chose que l'API fait connaîtreun livre
Collectionl'ensemble des ressources de même sorte/livres
Point d'accèsl'adresse à laquelle on envoie une requête
Méthode sûreune méthode qui lit sans rien changerGET
Méthode idempotenteune méthode qu'on peut répéter sans changer le résultat final
Filtrela partie de l'adresse après le point d'interrogation, qui choisit les lignes?id=eq.3

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

L'adresse nomme la chose, la méthode agit

Dans une API REST, l'adresse désigne une chose, jamais une action. On écrit /livres et non /ajouterUnLivre. Le nom est au pluriel, car c'est la collection.

Ce que vous voulez faire de cette chose, c'est la méthode HTTP qui le dit. Une même adresse sert donc à lire, ajouter ou supprimer.

Exemple : de l'action à la requête

Action voulueAdresse à éviterRequête REST
Lister les livres/listerLivresGET /livres
Lire le livre 3/lireLivre?num=3GET /livres?id=eq.3
Ajouter un livre/ajouterLivrePOST /livres
Supprimer le livre 3/supprimerLivre?num=3DELETE /livres?id=eq.3

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Une ligne se désigne par un filtre

Beaucoup d'API écrivent /livres/3 pour le livre numéro 3. Le serveur du laboratoire utilise un filtre : /livres?id=eq.3. Les deux disent la même chose : la ressource de numéro 3 dans la collection livres.

Préparez d'abord le catalogue. Le Run recrée la table, et peut être relancé pour repartir de zéro.

Créer la table des livres

Commande
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.

Lire le livre numéro 3

Commande
curl -s -w "\n" "http://api:3000/livres?id=eq.3"

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.

Chaque méthode a un rôle précis

GET lit. POST ajoute. PUT remplace une ligne entière. PATCH change seulement quelques champs. DELETE retire.

Deux mots comptent pour un concepteur. Une méthode sûre ne change rien. Une méthode idempotente peut être répétée : le résultat final est le même, que vous l'envoyiez une fois ou trois.

Exemple : les cinq méthodes

MéthodeRôleSûreIdempotente
GETLireOuiOui
POSTAjouter une ligneNonNon
PUTRemplacer une ligne entièreNonOui
PATCHChanger quelques champsNonPas toujours
DELETERetirerNonOui

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Répéter une requête change parfois le résultat

Le titre d'un livre est unique dans la table. Un POST qui ajoute Nana réussit la première fois. La seconde fois, le titre existe déjà et le serveur refuse.

Un DELETE se comporte autrement. Après le premier, Nana a disparu. Le second ne change plus rien. Lancez chaque Run deux fois et comparez les codes.

Ajouter le livre Nana

Commande
curl -s -o /dev/null -w "%{http_code}\n" -X POST -H "Content-Type: application/json" -d '{"titre":"Nana","auteur":"Emile Zola","annee":1880}' "http://api:3000/livres"

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.

Supprimer le livre Nana

Commande
curl -s -o /dev/null -w "%{http_code}\n" -X DELETE "http://api:3000/livres?titre=eq.Nana"

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 POST convient à toute action, puisqu'il marche toujours. C'est faux : POST n'est ni sûr ni répétable, donc un client qui réessaie après une panne peut ajouter deux fois. Choisissez la méthode qui dit l'action.

Une adresse peut aussi filtrer, trier et limiter

Après le ?, chaque filtre a la forme colonne=opérateur.valeur. gte veut dire « plus grand ou égal » et lt « plus petit que ». On les relie avec &.

select=titre,annee choisit les colonnes. order=annee,id trie. limit=2 coupe la liste. Mettez l'adresse entre guillemets, sinon le shell lit le &.

Les livres parus depuis 1860

Commande
curl -s -w "\n" "http://api:3000/livres?annee=gte.1860&select=titre,annee&order=annee,id"

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.

Compter les livres d'avant 1900

Commande
curl -s "http://api:3000/livres?annee=lt.1900&select=id" | grep -o '"id"' | wc -l

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.

À propos de ce labo et de sa source: Lab PostgreSQL et PostgREST : une base de données et une API REST dans le navigateur

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.