Les API REST communiquent via HTTP avec des requêtes et des réponses. Un client envoie une méthode, une URL, des en-têtes et un corps optionnel, et le serveur retourne un code de statut et des données.
Le concept central : requête et réponse
Une API (Application Programming Interface) est un moyen pour deux logiciels de communiquer entre eux. Une API REST est un style d'API spécifique qui utilise HTTP, le même protocole que ton navigateur utilise pour charger des sites web.
La conversation suit toujours le même schéma :
1. Ton code (ou test) envoie une requête
2. Le serveur la traite et renvoie une réponse
C'est tout. Le reste, ce sont des détails sur la façon dont ces deux éléments sont structurés.
Anatomie d'une requête HTTP
Chaque requête comporte quatre parties :
1. Méthode (le verbe)
La méthode indique au serveur ce que tu veux faire :
| Méthode | Ce qu'elle fait | Comme dire |
|---|---|---|
| GET | Récupérer des données | "Donne-moi cet élément" |
| POST | Créer quelque chose de nouveau | "Voici de nouvelles données, sauvegarde-les" |
| PUT | Remplacer complètement | "Remplace ça par ma nouvelle version" |
| PATCH | Mettre à jour partiellement | "Change juste ce champ" |
| DELETE | Supprimer | "Supprime ça" |
Un endpoint de rapport de bug pourrait fonctionner ainsi :
GET /bugs→ lister tous les bugsGET /bugs/42→ obtenir le bug #42POST /bugs→ créer un nouveau bugPATCH /bugs/42→ mettre à jour le statut du bug #42DELETE /bugs/42→ supprimer le bug #42
2. URL (l'adresse)
L'URL indique au serveur sur quoi tu travailles :
https://api.becomeqa.com/v1/users/123/ordersDécortiquons cela :
https://api.becomeqa.com: le serveur/v1: version de l'API (courant, pas toujours présent)/users/123: l'utilisateur spécifique avec l'ID 123/orders: ses commandes
Les parties après le domaine s'appellent le chemin (path). Les nombres et IDs dans le chemin (comme 123) s'appellent des paramètres de chemin.
Parfois les données passent dans l'URL comme paramètres de requête :
GET /users?role=admin&active=true&page=2La partie ?role=admin&active=true&page=2 filtre et pagine les résultats sans changer la ressource dont on parle.
3. En-têtes
Les en-têtes sont des métadonnées envoyées avec la requête. On ne les voit pas normalement dans le navigateur (ils sont dans l'onglet Network). Les plus courants :
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Accept: application/jsonContent-Type indique au serveur dans quel format est le corps de ta requête. Authorization prouve qui tu es (plus de détails ci-dessous). Accept indique au serveur dans quel format tu veux la réponse.
4. Corps
Les requêtes POST, PUT et PATCH incluent généralement un corps, les données réelles envoyées. Les API REST utilisent presque toujours JSON :
{
"title": "Bouton de connexion ne fonctionne pas sur mobile",
"severity": "high",
"steps": ["Ouvrir l'app sur mobile", "Appuyer sur Connexion", "Rien ne se passe"]
}Les requêtes GET et DELETE n'ont généralement pas de corps.
Anatomie d'une réponse HTTP
Le serveur répond avec :
1. Code de statut
Un nombre à 3 chiffres qui indique ce qui s'est passé :
| Plage | Catégorie | Signification |
|---|---|---|
| 2xx | Succès | La requête a fonctionné |
| 3xx | Redirection | La ressource a été déplacée, va là |
| 4xx | Erreur client | Ta requête est incorrecte |
| 5xx | Erreur serveur | Le serveur a planté |
Les codes les plus importants pour les tests :
| Code | Nom | Quand il apparaît |
|---|---|---|
| 200 | OK | Succès standard pour GET |
| 201 | Created | POST qui a créé quelque chose |
| 204 | No Content | Succès mais rien à retourner (DELETE) |
| 400 | Bad Request | Saisie invalide (champ manquant, mauvais format) |
| 401 | Unauthorized | Non authentifié (token absent ou invalide) |
| 403 | Forbidden | Authentifié mais non autorisé |
| 404 | Not Found | La ressource n'existe pas |
| 422 | Unprocessable Entity | JSON valide mais échec de validation |
| 429 | Too Many Requests | Limite de débit atteinte |
| 500 | Internal Server Error | Crash backend non géré |
| 503 | Service Unavailable | Serveur hors ligne ou surchargé |
2. En-têtes de réponse
Similaires aux en-têtes de requête, des métadonnées sur la réponse :
Content-Type: application/json
X-Request-Id: abc-123-def
Cache-Control: no-cache3. Corps de la réponse
Les données réelles retournées, généralement en JSON :
{
"id": 42,
"title": "Bouton de connexion ne fonctionne pas sur mobile",
"severity": "high",
"status": "open",
"created_at": "2026-05-17T10:30:00Z"
}Ou une erreur :
{
"error": "validation_failed",
"message": "Le titre est requis",
"field": "title"
}Authentification : comment les API savent qui tu es
La plupart des API requièrent une authentification. Deux approches principales :
Bearer Token / JWT
Après la connexion, le serveur te donne un token, une longue chaîne qui prouve ton identité. Tu l'inclus dans chaque requête suivante :
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOjEyMywicm9sZSI6ImFkbWluIn0.abc123Le serveur valide le token sans avoir besoin de rechercher ta session en base de données. Les tokens expirent (généralement entre 15 minutes et 24 heures).
Sessions basées sur les cookies
Ancien pattern. Après la connexion, le serveur définit un cookie. Le navigateur l'envoie automatiquement avec chaque requête à ce domaine. Tu ne le vois pas dans le corps de la requête, le navigateur gère ça.
Clés API
Utilisées pour la communication serveur à serveur. Une clé statique dans l'en-tête :
X-API-Key: sk-1234567890abcdefComment inspecter les appels API dans un navigateur
Ouvre les DevTools → onglet Network → filtre par "Fetch/XHR". Chaque appel API fait par ton application apparaîtra ici.
Clique sur n'importe quelle requête pour voir :
- Onglet Headers : en-têtes de requête, URL, méthode
- Onglet Payload : corps de la requête
- Onglet Response : ce que le serveur a retourné
- Code de statut : dans la vue liste, la colonne numérique
C'est là qu'on débogue "est-ce un bug frontend ou backend ?" Si l'interface affiche des données incorrectes, vérifie ce que l'API a réellement retourné. Si l'API a retourné les bonnes données et que l'interface les affiche mal, c'est frontend. Si l'API a retourné de mauvaises données, c'est backend.
Tester les API : ce qu'il faut vérifier
Lors du test d'un endpoint API (manuellement ou avec Playwright), vérifie :
Le code de statut correspond à l'attendu
- Créer une ressource →
201, pas200 - Obtenir une ressource →
200 - Suppression réussie sans contenu →
204 - Saisie invalide →
400ou422, pas500
Le corps de la réponse est correct
- Les champs requis sont présents
- Les types de données sont corrects (
"age": 25et non"age": "25") - Les valeurs correspondent à ce qui a été envoyé
- Aucune donnée sensible n'est exposée (mots de passe, IDs internes)
Les réponses d'erreur sont utiles
Les erreurs 400 doivent expliquer ce qui était invalide, et les erreurs 404 doivent confirmer que la ressource n'existe pas. Les erreurs 401 ne doivent pas révéler d'informations sensibles à la sécurité.
Les cas limites se comportent correctement
- Liste vide : retourne
[]et nonnull - ID inexistant : retourne
404et non500 - Corps JSON invalide : retourne
400et non500 - Action non autorisée : retourne
403et non200avec un corps vide
Les API REST dans Playwright
Playwright peut faire des requêtes HTTP directement, sans navigateur :
test('créer un utilisateur retourne 201', async ({ request }) => {
const response = await request.post('https://api.becomeqa.com/users', {
data: {
name: 'Test User',
email: 'test@example.com',
role: 'member',
},
});
expect(response.status()).toBe(201);
const body = await response.json();
expect(body.id).toBeTruthy();
expect(body.email).toBe('test@example.com');
expect(body).not.toHaveProperty('password'); // pas de fuite
});On peut aussi intercepter les appels API faits par le navigateur pendant les tests E2E :
test('gère l\'erreur API correctement', async ({ page }) => {
// Forcer l'API à retourner une erreur
await page.route('**/api/users', (route) => {
route.fulfill({ status: 500, body: JSON.stringify({ error: 'server error' }) });
});
await page.goto('/users');
// L'application doit afficher un état d'erreur, pas planter
await expect(page.locator('[data-testid="error-banner"]')).toBeVisible();
});Résumé du vocabulaire clé
| Terme | Signification |
|---|---|
| API | Interface pour la communication entre logiciels |
| REST | Un style d'API qui utilise HTTP |
| Endpoint | Une combinaison URL + méthode spécifique (GET /users) |
| Requête | Ce que tu envoies au serveur |
| Réponse | Ce que le serveur renvoie |
| Code de statut | Nombre à 3 chiffres indiquant le succès ou l'échec |
| JSON | Le format de données utilisé par les API REST |
| En-tête | Métadonnées attachées à une requête ou réponse |
| Corps | Les données réelles dans une requête ou réponse |
| Bearer token | Credential envoyé dans l'en-tête Authorization |
| Paramètre de chemin | Partie variable de l'URL (/users/123, où 123 est le param) |
| Paramètre de requête | Filtres dans l'URL après ? (?page=2&sort=asc) |
Comprendre les API REST fait de toi un ingénieur QA considérablement meilleur. Tu peux lire le trafic réseau et diagnostiquer si un bug est frontend ou backend. Tu peux aussi écrire des tests au niveau API, 100 fois plus rapides que les tests navigateur, et parler bien plus efficacement aux développeurs quand tu signales des bugs.
→ See also: Tests d'API 101: Tout ce que Chaque Ingénieur QA Doit Savoir en 2026 | Codes de Statut HTTP que Tout Ingénieur QA Doit Connaître | Tests d'API avec Playwright: Au-delà de l'Interface | Comment Fonctionne Internet pour les Testeurs