En bref (TL;DR)
Le Swagger Petstore viole des principes REST fondamentaux : il utilise des noms de ressources au singulier de manière incohérente, inclut des verbes d'action dans les URL, renvoie des codes d'état HTTP incorrects, expose des mots de passe dans les requêtes GET et renvoie des tableaux bruts sans métadonnées. Le Modern PetstoreAPI corrige tous ces problèmes avec une conception RESTful appropriée, une gestion des erreurs RFC 9457 et des modèles prêts pour la production.
Introduction
Pendant plus d'une décennie, le Swagger Petstore a été l'exemple par défaut pour apprendre OpenAPI. Des millions de développeurs l'ont étudié, copié ses modèles et construit des API de production basées sur sa conception. Il y a un problème : il vous apprend à construire de mauvaises API.
Le Swagger Petstore viole les principes REST de base, inclut des vulnérabilités de sécurité et démontre des anti-modèles qui nuisent aux systèmes de production. C'est comme apprendre à conduire avec une voiture dont les pédales de frein et d'accélérateur sont inversées — vous apprendrez, mais vous apprendrez mal.
Les dégâts sont réels. Les développeurs qui ont appris du Swagger Petstore intègrent ces anti-modèles dans le code de production. Les API sont construites avec des noms incohérents, de mauvaises méthodes HTTP et des failles de sécurité. Les revues de code passent à côté de ces problèmes car « c'est comme ça que Petstore le fait. »
Dans ce guide, vous apprendrez précisément ce qui ne va pas avec le Swagger Petstore, pourquoi ces problèmes sont importants et comment Modern PetstoreAPI les corrige avec des modèles prêts pour la production. Vous verrez des comparaisons côte à côte, comprendrez l'impact de chaque violation et découvrirez comment tester correctement vos API avec Apidog.
Le problème de l'héritage du Swagger Petstore
Le Swagger Petstore a été créé en 2011 comme un exemple simple pour la spécification Swagger (maintenant OpenAPI). Il a rempli son objectif : démontrer comment écrire une spécification OpenAPI. Mais il n'a jamais été conçu pour être une référence en matière de conception d'API REST.
Pourquoi il est devenu la norme de facto
Lorsque les développeurs apprennent OpenAPI, ils commencent par l'exemple officiel. Le Swagger Petstore est cet exemple. Il est présent dans la documentation, les tutoriels et les générateurs de code. Si vous avez utilisé Swagger UI ou Swagger Codegen, vous l'avez vu.
Le problème : les développeurs supposent que « l'exemple officiel = meilleure pratique ». Ils copient les modèles sans les remettre en question. Les cours de conception d'API l'utilisent comme outil pédagogique. Les entreprises construisent des API internes en suivant sa structure.
Le coût des mauvais exemples
Les mauvais exemples s'accumulent avec le temps :
- Les développeurs juniors apprennent des anti-modèles - Ils ne savent pas que ce sont des erreurs
- Les générateurs de code perpétuent les problèmes - Les SDK générés héritent des défauts
- Les outils de documentation affichent de mauvais exemples - Swagger UI affiche le Petstore par défaut
- Les entreprises construisent des API de production de cette manière - « Si c'est suffisant pour Swagger… »
Le Swagger Petstore a probablement influencé plus de conceptions d'API que tout autre exemple dans l'histoire. C'est pourquoi ses défauts sont importants.
Violations REST critiques dans le Swagger Petstore
Examinons les violations REST spécifiques dans le Swagger Petstore et pourquoi elles sont incorrectes.
1. Nommage de ressources incohérent (pluriel vs singulier)
La violation :
GET /pet/{petId} ← Singulier
GET /store/inventory ← Pluriel
POST /pet ← Singulier
GET /user/{username} ← Singulier
Pourquoi c'est incorrect :
Les ressources REST représentent des collections. Une collection est au pluriel. Lorsque vous accédez à /pets, vous accédez à la collection d'animaux. Lorsque vous accédez à /pets/123, vous accédez à l'élément 123 de la collection d'animaux.
Mélanger le singulier et le pluriel brise ce modèle mental. Est-ce que /pet/123 accède à la collection d'animaux ou à une seule ressource d'animal ? L'incohérence crée de la confusion.
La correction de Modern PetstoreAPI :
GET /pets/{petId} ← Toujours pluriel
GET /stores/inventory ← Cohérent
POST /pets ← Pluriel pour la collection
GET /users/{username} ← Pluriel partout
Modern PetstoreAPI utilise des noms de ressources au pluriel de manière cohérente sur tous les points de terminaison. Consultez la documentation de l'API REST pour la structure complète des points de terminaison.
2. Verbes d'action dans les URL
La violation :
GET /pet/findByStatus?status=available
GET /pet/findByTags?tags=tag1,tag2
GET /user/login?username=john&password=secret
GET /user/logout
Pourquoi c'est incorrect :
Les URL REST doivent représenter des ressources (noms), pas des actions (verbes). La méthode HTTP est le verbe. GET /pets signifie « obtenir la ressource des animaux ». L'ajout de findByStatus est redondant — c'est à cela que servent les paramètres de requête.
Les verbes d'action dans les URL indiquent que vous pensez en termes d'appel de procédure distante (RPC), et non en termes REST. Vous exposez des détails d'implémentation au lieu de ressources.
La correction de Modern PetstoreAPI :
GET /pets?status=AVAILABLE ← Ressource + filtre
GET /pets?tags=tag1,tag2 ← Paramètres de requête pour le filtrage
POST /auth/login ← Ressource d'authentification séparée
POST /auth/logout ← Points de terminaison d'authentification RESTful
Le Modern PetstoreAPI utilise des paramètres de requête pour le filtrage et des ressources d'authentification distinctes. Consultez le guide d'authentification pour les modèles d'authentification appropriés.
3. Codes d'état HTTP incorrects
La violation :
POST /pet
Réponse : 200 OK ← Devrait être 201 Created
DELETE /pet/{petId}
Réponse : 200 OK ← Devrait être 204 No Content
{
"message": "Animal supprimé"
}
Pourquoi c'est incorrect :
Les codes d'état HTTP ont des significations spécifiques :
200 OKsignifie « la requête a réussi, voici la ressource »201 Createdsignifie « ressource créée, voici où la trouver »204 No Contentsignifie « la requête a réussi, aucun corps à retourner »
Utiliser 200 pour tout brise la sémantique HTTP. Les clients ne peuvent pas distinguer entre « ressource récupérée » et « ressource créée ». Renvoyer un corps avec DELETE gaspille de la bande passante — le client n'a pas besoin de texte de confirmation.
La correction de Modern PetstoreAPI :
POST /pets
Réponse : 201 Created
Location: /pets/019b4132-70aa-764f-b315-e2803d882a24
{
"id": "019b4132-70aa-764f-b315-e2803d882a24",
"name": "Fluffy",
"status": "AVAILABLE"
}
DELETE /pets/{petId}
Réponse : 204 No Content
(aucun corps)
Modern PetstoreAPI utilise des codes d'état HTTP corrects et inclut des en-têtes Location pour les ressources créées. Consultez le guide des codes d'état HTTP pour le mappage complet.
4. Tableaux bruts sans métadonnées
La violation :
GET /pet/findByStatus?status=available
Réponse : 200 OK
[
{"id": 1, "name": "Fluffy"},
{"id": 2, "name": "Buddy"}
]
Pourquoi c'est incorrect :
Renvoyer des tableaux bruts crée des problèmes :
- Pas de métadonnées de pagination - Combien d'éléments au total ? À quelle page suis-je ?
- Pas d'extensibilité - Impossible d'ajouter des métadonnées sans casser les clients
- Pas de liens HATEOAS - Impossible d'inclure des liens de navigation
- Risque de détournement JSON - Les tableaux bruts sont vulnérables à certaines attaques
La correction de Modern PetstoreAPI :
GET /pets?status=AVAILABLE
Réponse : 200 OK
{
"data": [
{"id": "019b4132-70aa-764f-b315-e2803d882a24", "name": "Fluffy"},
{"id": "019b4127-54d5-76d9-b626-0d4c7bfce5b6", "name": "Buddy"}
],
"pagination": {
"page": 1,
"limit": 20,
"totalItems": 45,
"totalPages": 3
},
"links": {
"self": "/pets?status=AVAILABLE&page=1",
"next": "/pets?status=AVAILABLE&page=2",
"last": "/pets?status=AVAILABLE&page=3"
}
}
Modern PetstoreAPI encapsule toutes les collections dans des objets avec des métadonnées et des liens HATEOAS. Consultez le guide de pagination pour les détails d'implémentation.
5. Normes d'erreur manquantes
La violation :
Réponse : 400 Bad Request
{
"code": 400,
"message": "Entrée invalide"
}
Pourquoi c'est incorrect :
Ce format d'erreur est non standard et fournit des informations minimales :
- Pas d'identifiant de type d'erreur
- Pas d'erreurs de validation au niveau du champ
- Pas de codes d'erreur lisibles par machine
- Ne suit pas la RFC 9457 (Problem Details)
La correction de Modern PetstoreAPI :
Réponse : 400 Bad Request
Content-Type: application/problem+json
{
"type": "https://petstoreapi.com/errors/validation-error",
"title": "Erreur de validation",
"status": 400,
"detail": "La validation de la requête a échoué",
"instance": "/pets",
"errors": [
{
"field": "name",
"message": "Le nom est requis",
"code": "REQUIRED_FIELD"
},
{
"field": "status",
"message": "Le statut doit être l'un des suivants : AVAILABLE, PENDING, SOLD",
"code": "INVALID_ENUM"
}
]
}
Modern PetstoreAPI utilise la RFC 9457 Problem Details pour toutes les erreurs. Consultez le guide de gestion des erreurs pour le format d'erreur complet.
Désastres de sécurité dans l'ancienne conception
Au-delà des violations REST, le Swagger Petstore présente de graves problèmes de sécurité.
Requête GET avec mots de passe
La violation :
GET /user/login?username=john&password=secret123
Pourquoi c'est un désastre :
Les mots de passe dans les requêtes GET apparaissent dans :
- L'historique du navigateur - Toute personne ayant accès au navigateur voit le mot de passe
- Les journaux du serveur - Les serveurs web enregistrent les URL complètes, y compris les paramètres de requête
- Les en-têtes Referrer - Si l'utilisateur clique sur un lien après la connexion, le site suivant voit le mot de passe
- Les journaux de proxy - Les proxys d'entreprise enregistrent toutes les URL
- Les favoris du navigateur - Les utilisateurs peuvent mettre l'URL de connexion en favoris
Il s'agit d'une vulnérabilité de sécurité critique. Les mots de passe ne devraient jamais se trouver dans les URL.
La correction de Modern PetstoreAPI :
POST /auth/login
Content-Type: application/json
{
"username": "john",
"password": "secret123"
}
Réponse : 200 OK
{
"accessToken": "eyJhbGc...",
"refreshToken": "eyJhbGc...",
"expiresIn": 3600
}
Modern PetstoreAPI utilise POST pour l'authentification avec des corps JSON. Les mots de passe n'apparaissent jamais dans les URL. Consultez le guide d'authentification pour les modèles OAuth 2.0 et JWT.
Clés API dans les paramètres de requête
La violation :
GET /pet/123?api_key=abc123secret
Pourquoi c'est incorrect :
Les clés API dans les paramètres de requête présentent les mêmes problèmes que les mots de passe dans les URL :
- Enregistrées partout
- Visibles dans l'historique du navigateur
- Envoyées dans les en-têtes referrer
- Mises en cache par les proxys
La correction de Modern PetstoreAPI :
GET /pets/019b4132-70aa-764f-b315-e2803d882a24
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Modern PetstoreAPI utilise les en-têtes Authorization standard pour les clés API et les jetons. Consultez le guide de sécurité pour les modèles d'authentification.
Comment Modern PetstoreAPI corrige ces problèmes
Modern PetstoreAPI a été construit de zéro pour démontrer une conception d'API REST appropriée. Voici ce qui le rend différent :
Conception REST prête pour la production
- Noms de ressources au pluriel cohérents -
/pets,/orders,/users - URL orientées ressources - Pas de verbes d'action, seulement des noms
- Codes d'état HTTP corrects - 201 pour la création, 204 pour la suppression, codes d'erreur appropriés
- Encapsuleurs de collection - Toutes les listes incluent la pagination et les métadonnées
- Erreurs RFC 9457 - Format d'erreur standard avec validation au niveau du champ
Normes modernes
- OpenAPI 3.2 - Dernière spécification avec toutes les fonctionnalités
- RFC 9457 - Problem Details pour les API HTTP
- Limitation de débit IETF - En-têtes
RateLimit-*standard - ISO 8601 - Formats de date/heure appropriés
- UUIDv7 - Identifiants uniques triables
Support multi-protocole
Contrairement au Swagger Petstore (REST uniquement), Modern PetstoreAPI prend en charge :
- REST (OpenAPI 3.2)
- GraphQL
- gRPC
- WebSocket
- Server-Sent Events (SSE)
- MQTT
- Webhooks
- Model Context Protocol (MCP)
Consultez le guide des protocoles pour les détails d'implémentation.
Logique métier réelle
Modern PetstoreAPI inclut des fonctionnalités réalistes :
- Traitement des paiements
- Gestion des stocks
- Exécution des commandes
- Notifications par webhook
- Recommandations d'animaux de compagnie basées sur l'IA
- Téléchargement et traitement d'images
Consultez la documentation API pour l'ensemble complet des fonctionnalités.
Tester la conception d'API REST avec Apidog
Apidog vous aide à valider la conception d'API REST et à détecter les violations avant qu'elles n'atteignent la production.
Importer et valider les spécifications OpenAPI
# Importer la spécification Modern PetstoreAPI
1. Ouvrez Apidog
2. Cliquez sur "Importer" → "OpenAPI"
3. Entrez : https://petstoreapi.com/openapi.json
4. Apidog valide la spécification et crée des cas de test
Apidog détecte automatiquement :
- Les noms de ressources incohérents
- Les codes d'état HTTP manquants
- Les structures de réponse invalides
- Les problèmes de sécurité dans l'authentification
Tester les principes REST
Créez des cas de test qui vérifient la conformité REST :
Test : Les noms de ressources sont au pluriel
// Script de test Apidog
pm.test("Le point de terminaison utilise un nom de ressource au pluriel", function() {
const url = pm.request.url.toString();
pm.expect(url).to.match(/\/pets\/|\/orders\/|\/users\//);
pm.expect(url).to.not.match(/\/pet\/|\/order\/|\/user\//);
});
Test : Codes d'état corrects
pm.test("POST renvoie 201 Created", function() {
if (pm.request.method === "POST") {
pm.response.to.have.status(201);
pm.response.to.have.header("Location");
}
});
pm.test("DELETE renvoie 204 No Content", function() {
if (pm.request.method === "DELETE") {
pm.response.to.have.status(204);
pm.expect(pm.response.text()).to.be.empty;
}
});
Test : Les collections ont des métadonnées
pm.test("La réponse de la collection inclut la pagination", function() {
const response = pm.response.json();
pm.expect(response).to.have.property("data");
pm.expect(response).to.have.property("pagination");
pm.expect(response.pagination).to.have.property("page");
pm.expect(response.pagination).to.have.property("totalItems");
});
Comparer l'ancien et le nouveau Petstore
Importez les deux spécifications dans Apidog et exécutez des comparaisons côte à côte :
- Importez le Swagger Petstore :
https://petstore.swagger.io/v2/swagger.json - Importez le Modern PetstoreAPI :
https://petstoreapi.com/openapi.json - Exécutez des tests automatisés sur les deux
- Comparez les résultats pour voir les différences
Apidog mettra en évidence les violations de conception dans le Swagger Petstore et montrera comment Modern PetstoreAPI les corrige.
Guide de migration : de l'ancien Petstore à la conception moderne
Si vous avez construit une API basée sur le Swagger Petstore, voici comment migrer vers une conception REST appropriée :
Étape 1 : Corriger les noms de ressources
Avant :
GET /pet/{petId}
POST /pet
DELETE /pet/{petId}
Après :
GET /pets/{petId}
POST /pets
DELETE /pets/{petId}
Stratégie de migration :
- Prendre en charge les deux points de terminaison pendant la transition
- Ajouter des avertissements de dépréciation aux anciens points de terminaison
- Mettre à jour la documentation pour afficher les nouveaux points de terminaison
- Surveiller l'utilisation et supprimer les anciens points de terminaison après 6 mois
Étape 2 : Supprimer les verbes d'action
Avant :
GET /pet/findByStatus?status=available
GET /pet/findByTags?tags=tag1,tag2
Après :
GET /pets?status=AVAILABLE
GET /pets?tags=tag1,tag2
Stratégie de migration :
- Rediriger les anciens points de terminaison vers les nouveaux avec un 301 Moved Permanently
- Mettre à jour les SDK clients pour utiliser les nouveaux points de terminaison
- Ajouter la validation des paramètres de requête
Étape 3 : Corriger les codes d'état HTTP
Avant :
POST /pet → 200 OK
DELETE /pet/{petId} → 200 OK avec corps
Après :
POST /pets → 201 Created avec en-tête Location
DELETE /pets/{petId} → 204 No Content (aucun corps)
Stratégie de migration :
- Ceci est un changement majeur pour les clients qui vérifient les codes d'état
- Versionner votre API (v2) avec des codes d'état corrects
- Documenter clairement les changements
- Fournir un calendrier de migration
Étape 4 : Encapsuler les collections
Avant :
[
{"id": 1, "name": "Fluffy"},
{"id": 2, "name": "Buddy"}
]
Après :
{
"data": [...],
"pagination": {...},
"links": {...}
}
Stratégie de migration :
- Ceci est un changement majeur
- Créer des points de terminaison v2 avec des réponses encapsulées
- Déprécier les points de terminaison v1
- Mettre à jour le code client pour gérer la nouvelle structure
Étape 5 : Implémenter les erreurs RFC 9457
Avant :
{
"code": 400,
"message": "Entrée invalide"
}
Après :
{
"type": "https://petstoreapi.com/errors/validation-error",
"title": "Erreur de validation",
"status": 400,
"detail": "La validation de la requête a échoué",
"errors": [...]
}
Stratégie de migration :
- Ajouter l'en-tête
Content-Type: application/problem+json - Inclure les anciens et les nouveaux formats d'erreur pendant la transition
- Mettre à jour la gestion des erreurs client
- Supprimer l'ancien format après la période de migration
Impact réel d'une mauvaise conception d'API
Une mauvaise conception d'API a des coûts réels :
Confusion des développeurs
Lorsque les API violent les principes REST, les développeurs perdent du temps à :
- Deviner quelle méthode HTTP utiliser
- Comprendre des modèles de nommage incohérents
- Déboguer des codes d'état inattendus
- Gérer les erreurs sans structure appropriée
Coût : Heures de temps de développeur par intégration
Bugs clients
Les API incohérentes entraînent des bugs côté client :
- Erreurs d'analyse dues à des structures de réponse inattendues
- Échecs d'authentification dus à de mauvaises méthodes HTTP
- Problèmes de pagination dus à des métadonnées manquantes
- Échecs de gestion des erreurs dus à des formats non standard
Coût : Incidents de production et impact sur les clients
Vulnérabilités de sécurité
Les défauts de conception créent des risques de sécurité :
- Les mots de passe dans les URL sont journalisés
- Les clés API dans les paramètres de requête sont mises en cache
- Authentification manquante sur les points de terminaison sensibles
- Les messages d'erreur inappropriés divulguent des informations système
Coût : Violations de données et non-conformité
Dette technique
Les mauvais exemples s'accumulent avec le temps :
- Les nouveaux développeurs apprennent des anti-modèles
- Les générateurs de code produisent des SDK défectueux
- La documentation présente des exemples incorrects
- Les entreprises construisent de nouvelles API avec les mêmes erreurs
Coût : Charge de maintenance à long terme
Conclusion
Le Swagger Petstore a rempli son rôle d'exemple OpenAPI simple, mais il est temps de passer à autre chose. Ses violations REST, ses problèmes de sécurité et ses anti-modèles ont influencé trop d'API de production.
Modern PetstoreAPI fournit l'implémentation de référence dont l'industrie a besoin : une conception REST appropriée, des normes modernes, un support multi-protocole et des modèles prêts pour la production. Utilisez-le comme ressource d'apprentissage et référence pour la conception d'API.
Testez vos API avec Apidog pour détecter les violations de conception dès le début. Importez vos spécifications OpenAPI, exécutez des tests automatisés et assurez-vous que vos API respectent les principes REST avant qu'elles n'atteignent la production.
Étapes suivantes :
- Explorez la documentation Modern PetstoreAPI
- Comparez la conception de votre API aux modèles Modern PetstoreAPI
- Importez votre spécification OpenAPI dans Apidog pour validation
- Corrigez les violations REST à l'aide du guide de migration ci-dessus
- Adoptez la RFC 9457 pour la gestion des erreurs
L'ère des mauvais exemples d'API est révolue. Construisez des API de la bonne manière avec Modern PetstoreAPI.
FAQ
Pourquoi Swagger a-t-il créé un mauvais exemple ?
Le Swagger Petstore a été créé en 2011 comme une simple démonstration de la spécification Swagger. Il n'était pas destiné à être une référence en matière de conception d'API REST. Le problème est qu'il est devenu l'exemple de facto standard, et ses défauts ont été copiés par des millions de développeurs.
Devrais-je arrêter d'utiliser le Swagger Petstore ?
Oui, pour apprendre la conception d'API REST. Utilisez Modern PetstoreAPI à la place. Il démontre les principes REST appropriés, les normes modernes et les modèles prêts pour la production. L'ancien Petstore enseigne des anti-modèles qui nuisent aux systèmes de production.
Modern PetstoreAPI est-il prêt pour la production ?
Oui. Modern PetstoreAPI inclut une logique métier réaliste, une gestion des erreurs appropriée, l'authentification, la limitation de débit et des fonctionnalités de sécurité. Vous pouvez le déployer avec des modifications minimales ou l'utiliser comme référence pour la conception de votre propre API.
Comment puis-je tester si mon API respecte les principes REST ?
Importez votre spécification OpenAPI dans Apidog et exécutez des tests automatisés. Apidog valide le nommage des ressources, les codes d'état HTTP, les structures de réponse et les modèles de sécurité. Vous pouvez également comparer votre API côte à côte avec Modern PetstoreAPI.
Quelle est la plus grande erreur dans le Swagger Petstore ?
Utiliser GET /user/login avec des mots de passe dans les paramètres de requête. Cela expose les mots de passe dans l'historique du navigateur, les journaux du serveur et les en-têtes referrer — une vulnérabilité de sécurité critique. Utilisez toujours POST avec des corps JSON pour l'authentification.
Puis-je migrer progressivement des modèles Swagger Petstore ?
Oui. Prenez en charge les anciens et les nouveaux points de terminaison pendant une période de transition. Ajoutez des avertissements de dépréciation aux anciens points de terminaison, mettez à jour la documentation et surveillez l'utilisation. Supprimez les anciens points de terminaison après que les clients ont migré (généralement 6 à 12 mois).
Modern PetstoreAPI prend-il en charge GraphQL et gRPC ?
Oui. Contrairement au Swagger Petstore (REST uniquement), Modern PetstoreAPI prend en charge plusieurs protocoles : REST, GraphQL, gRPC, WebSocket, SSE, MQTT, Webhooks et MCP. Consultez le guide des protocoles pour plus de détails.
Comment puis-je convaincre mon équipe de corriger la conception de notre API ?
Montrez-leur les coûts réels : confusion des développeurs, bugs clients, vulnérabilités de sécurité et dette technique. Utilisez Apidog pour démontrer les violations dans votre API actuelle. Comparez votre conception à Modern PetstoreAPI et montrez les améliorations.
