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

Tester une API HTTP

Après cette leçon: Je peux tester une API avec de bonnes requêtes, de mauvaises requêtes et des reprises, et dire ce que prouve chaque vérification.

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

Comment tester une API web

Un test d’API envoie une requête et vérifie la réponse. Il ne regarde pas le code derrière l’API. Il pose seulement ce qu’un appelant poserait, et compare la réponse avec ce que l’API a promis.

Vous allez écrire quelques vérifications à la main, en voir une échouer, et tester ce qui arrive quand on envoie une requête deux fois.

À la fin de cette leçon

Remarque

Je peux tester une API avec de bonnes requêtes, de mauvaises requêtes et des reprises, et dire ce que prouve chaque vérification.

Mots clés

MotCe que ça veut dire
Cas de testune requête et la réponse que l’on attend
Statut attendule code de statut que l’API doit renvoyer
Données de testdes lignes faites pour un test, que l’on peut retrouver et retirer
Repriserenvoyer la même requête, parce que la première réponse s’est perdue
Idempotentl’envoyer deux fois laisse les choses comme après l’avoir envoyée une fois

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

Une vérification : une requête et un statut

Taper curl et lire des nombres à l’œil ne passe pas à l’échelle. Écrivez la vérification une fois : un nom, le statut voulu et la requête.

Donnez d’abord le mot de passe à psql et créez la table livres. Puis définissez dans votre terminal une petite fonction nommée verifier, qui envoie la requête et dit REUSSI ou ECHEC.

Donner le mot de passe à psql

Commande
export PGPASSWORD=shop

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.

Créer la table livres

Commande
psql -h db -U shop -c "drop table if exists livres; create table livres (id serial primary key, titre text not null, annee int not null, disponible boolean not null default true); insert into livres (titre, annee, disponible) values ('Cartes de la mer', 1998, true), ('Fleuves du monde', 2004, false), ('Trains de nuit', 2011, 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.

Définir la fonction verifier

Commande
verifier() { attendu=$1; nom=$2; shift 2; obtenu=$(curl -s -o /dev/null -w '%{http_code}' "$@"); if [ "$obtenu" = "$attendu" ]; then echo "REUSSI $nom"; else echo "ECHEC $nom, attendu $attendu et obtenu $obtenu"; fi; }

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.

Vérifier une bonne requête

Commande
verifier 200 "lister les livres" "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.

Vérifier quelque chose qui doit échouer

Commande
verifier 200 "faux exprès" "http://api:3000/rien"

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.

Tester ce que l’API refuse

La seconde vérification était fausse exprès, pour prouver que la fonction sait dire ECHEC. Une vérification qui affiche toujours REUSSI est pire que rien.

Une bonne série de tests passe autant de temps sur les mauvaises requêtes que sur les bonnes. Chacune doit revenir en 4xx avec le bon code, et ne doit pas changer les données.

Vérifier un livre sans titre

Commande
verifier 400 "sans titre" -X POST -H "Content-Type: application/json" -d '{"annee":2019}' "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.

Vérifier un corps qui n’est pas du JSON

Commande
verifier 400 "json casse" -X POST -H "Content-Type: application/json" -d 'ceci n est pas du json' "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.

Vérifier l’ajout d’un livre de test

Commande
verifier 201 "ajouter un livre" -X POST -H "Content-Type: application/json" -d '{"id":900,"titre":"Livre de test","annee":2020}' "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.

Vérifier le même id de nouveau

Commande
verifier 409 "meme id encore" -X POST -H "Content-Type: application/json" -d '{"id":900,"titre":"Livre de test","annee":2020}' "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.

Vérifier le corps en plus du statut

Commande
curl -s "http://api:3000/livres?id=eq.900" | grep -q '"titre":"Livre de test"' && echo "REUSSI le corps contient le titre" || echo "ECHEC le corps contient le titre"

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.

Tester une requête envoyée deux fois

Les réseaux perdent des réponses, alors les clients renvoient la même requête. Une requête est idempotente si l’envoyer deux fois laisse les données comme après un seul envoi.

Testez-le en comptant les lignes. D’abord un changement qui fixe une valeur, puis un POST sans id, qui doit faire un nouveau livre à chaque fois.

Envoyer deux fois le même changement

Commande
for i in 1 2; do curl -s -o /dev/null -w "%{http_code}\n" -X PATCH -H "Content-Type: application/json" -d '{"disponible":false}' "http://api:3000/livres?id=eq.1"; done

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.

Envoyer deux fois le même nouveau livre

Commande
for i in 1 2; do curl -s -o /dev/null -X POST -H "Content-Type: application/json" -d '{"titre":"Deux fois","annee":2020}' "http://api:3000/livres"; done

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 nommés Deux fois

Commande
psql -h db -U shop -At -c "select count(*) from livres where titre = 'Deux fois'"

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.

Rendre une création rejouable

Deux livres nommés Deux fois veulent dire qu’une reprise a fait un doublon. Un appelant qui choisit l’id peut rendre la création sûre. Il envoie le même id, avec un en-tête qui dit « s’il est déjà là, mets-le à jour ».

Le premier appel répond 201 et le second 200. Les deux laissent une seule ligne.

Envoyer deux fois une création sûre

Commande
for i in 1 2; do curl -s -o /dev/null -w "%{http_code}\n" -X POST -H "Content-Type: application/json" -H "Prefer: resolution=merge-duplicates" -d '{"id":902,"titre":"Une fois","annee":2020}' "http://api:3000/livres"; done

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 lignes avec cet id

Commande
psql -h db -U shop -At -c "select count(*) from livres where id = 902"

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.

Exemple travaillé : quelles reprises sont sûres

Requête envoyée deux foisLignes après la secondeReprise sûre ?
PATCH d’un livre vers disponible falseLes mêmes qu’après la premièreOui, elle fixe une valeur
POST d’un livre sans idUne ligne de plus qu’après la premièreNon, elle fait un doublon
POST avec un id et merge-duplicatesLes mêmes qu’après la premièreOui, l’id nomme la ligne
DELETE du livre 900Parti après la première, toujours partiOui, mais le labo répond 204 les deux fois

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

Retirer les lignes de test

Commande
psql -h db -U shop -c "delete from livres where id >= 900 or titre = 'Deux fois'"

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 ne testent que la bonne requête et ne voient jamais un échec. Testez ce qui est refusé. Nettoyez aussi vos lignes de test. Sinon la seconde exécution trouve les données laissées par la première, et échoue pour une raison étrangère à l’API.

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