En bref
L’approche design-first consiste à rédiger la spécification de votre API avant le code d’implémentation. Cette spécification devient la source de vérité pour les maquettes, la documentation, les tests et les stubs client. En pratique, le bon outillage doit vous permettre de concevoir, simuler, documenter et valider une API sans maintenir plusieurs artefacts séparés.
Introduction
La plupart des développeurs commencent avec une approche code-first :
- écrire une route ;
- ajouter quelques annotations ;
- générer une documentation ;
- espérer que la documentation reste alignée avec le comportement réel.
Cela fonctionne sur de petits projets. Mais dès que plusieurs développeurs interviennent, la documentation dérive rapidement.
Exemple classique :
// Documentation
["foo", "bar"]
Mais l’API réelle renvoie :
[
{ "value": "foo" },
{ "value": "bar" }
]
Le problème n’est pas seulement documentaire. Le frontend, les tests automatisés, les SDK et les intégrations externes peuvent tous dépendre d’un contrat qui n’est plus fiable.
Avec une approche design-first, le contrat API est défini avant l’implémentation. Le code, la documentation, les maquettes et les tests sont ensuite alignés sur cette spécification.
Ce que le "design-first" signifie en pratique
Le "design-first" n’est pas une technologie. C’est un workflow.
1. Définir le contrat avant le code
Avant d’écrire le contrôleur backend, vous définissez une spécification OpenAPI avec :
- les chemins d’accès ;
- les méthodes HTTP ;
- les paramètres de chemin, requête et en-tête ;
- les corps de requête ;
- les schémas de réponse ;
- les codes de statut ;
- les règles d’authentification ;
- les descriptions de champs ;
- les exemples.
Exemple simplifié :
paths:
/users/{id}:
get:
summary: Récupérer un utilisateur
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
"200":
description: Utilisateur trouvé
content:
application/json:
schema:
$ref: "#/components/schemas/User"
"404":
description: Utilisateur introuvable
components:
schemas:
User:
type: object
required:
- id
- email
properties:
id:
type: string
email:
type: string
format: email
2. Générer une maquette utilisable
Une fois la spécification créée, le frontend peut consommer une API simulée sans attendre le backend.
Flux typique :
Spécification OpenAPI
↓
Serveur de maquette
↓
Développement frontend
Cela permet au frontend et au backend de travailler en parallèle.
3. Implémenter contre la spécification
Le backend traite la spécification comme un document d’exigences.
Chaque endpoint implémenté doit respecter :
- les paramètres attendus ;
- les formats de requête ;
- les codes de statut ;
- les schémas de réponse ;
- les erreurs prévues.
4. Valider automatiquement l’implémentation
Après l’implémentation, les tests doivent vérifier que l’API réelle correspond au contrat.
Exemple de vérification attendue :
GET /users/123
→ réponse HTTP 200
→ body conforme au schéma User
Si la réponse ne respecte pas la spécification, le test échoue.
5. Mettre à jour la spécification avant tout changement
Quand une exigence change, le workflow doit rester le même :
- modifier la spécification ;
- faire relire le changement ;
- mettre à jour les maquettes ;
- adapter l’implémentation ;
- exécuter les tests de contrat.
Ce dont une plateforme "design-first" a besoin
Tous les outils API ne sont pas adaptés à un workflow "design-first". Voici les fonctionnalités importantes.
Éditeur d’API visuel
Écrire du YAML à la main peut être lent et source d’erreurs, surtout sur de grandes API.
Un bon éditeur visuel doit permettre de définir :
- les endpoints ;
- les méthodes HTTP ;
- les paramètres ;
- les bodies ;
- les réponses ;
- les schémas réutilisables ;
- les exemples ;
- les règles de validation.
Il doit aussi générer une spécification OpenAPI valide.
Validation OpenAPI en temps réel
La spécification doit être valide avant d’être utilisée pour générer une documentation, une maquette ou des tests.
Une validation utile doit signaler immédiatement :
- les champs manquants ;
- les références
$refinvalides ; - les types incohérents ;
- les réponses mal structurées ;
- les erreurs de syntaxe.
Maquettes générées automatiquement
Le workflow idéal est simple :
Définir la spécification → obtenir une maquette utilisable
Aucune conversion manuelle ne devrait être nécessaire.
La maquette doit respecter les types et contraintes définis dans le schéma :
email:
type: string
format: email
age:
type: integer
minimum: 18
maximum: 99
Une bonne maquette doit donc générer :
{
"email": "user@example.com",
"age": 42
}
Documentation générée depuis la spécification
La documentation ne doit pas être maintenue séparément.
Elle doit être produite depuis la même source que :
- les maquettes ;
- les tests ;
- les schémas ;
- les exemples ;
- les contrats API.
Cela limite les écarts entre ce qui est documenté et ce qui est réellement attendu.
Workflow de révision d’équipe
Une modification de contrat API doit être traitée comme une modification de code.
Le workflow devrait permettre :
- les commentaires sur un endpoint ;
- les commentaires sur un champ spécifique ;
- l’historique des changements ;
- la revue asynchrone ;
- la validation avant implémentation.
Export OpenAPI standard
Votre spécification doit rester portable.
Vous devez pouvoir exporter l’API en OpenAPI standard pour l’utiliser avec :
- des générateurs de code ;
- des passerelles API ;
- des outils de test ;
- des validateurs de schéma ;
- des outils CI/CD.
Apidog en tant que plateforme "design-first"
Apidog est organisé autour de la spécification API comme artefact principal. La conception, la documentation, les maquettes et les tests sont connectés à la même définition d’API.
Éditeur OpenAPI visuel
Dans Apidog, la conception d’un endpoint se fait via une interface structurée.
Pour chaque route, vous pouvez définir :
- le chemin ;
- la méthode HTTP ;
- les paramètres ;
- le corps de requête ;
- les réponses ;
- les schémas ;
- les exemples ;
- les règles de validation.
Vous pouvez travailler sans écrire directement du YAML. Si vous préférez éditer la spécification brute, Apidog propose aussi une vue YAML/JSON.
Les deux vues restent synchronisées.
Exemple de schéma réutilisable :
components:
schemas:
UserProfile:
type: object
properties:
id:
type: string
name:
type: string
email:
type: string
format: email
Vous pouvez ensuite le référencer dans plusieurs endpoints :
schema:
$ref: "#/components/schemas/UserProfile"
Cela évite de dupliquer les mêmes structures dans toute l’API.
Prévisualisation de la documentation en temps réel
Pendant la conception, la documentation générée peut être prévisualisée.
Cela permet de vérifier rapidement :
- si les descriptions sont compréhensibles ;
- si les réponses sont lisibles ;
- si les exemples sont utiles ;
- si les schémas sont cohérents ;
- si un frontend peut intégrer l’endpoint sans poser de questions supplémentaires.
Ce point est important : si la documentation générée n’est pas claire, la spécification ne l’est probablement pas non plus.
Maquette intelligente depuis la spécification
Quand un endpoint est enregistré dans Apidog, le serveur de maquettes peut être utilisé immédiatement.
La maquette génère des réponses basées sur les schémas définis.
Exemples de comportement attendu :
- un champ
format: emailrenvoie une adresse e-mail valide ; - un entier avec
minimumetmaximumrespecte la plage ; - une énumération renvoie une valeur autorisée ;
- les objets imbriqués suivent le schéma ;
- les références
$refsont résolues.
Exemple de schéma :
status:
type: string
enum:
- active
- inactive
- pending
Exemple de réponse simulée :
{
"status": "active"
}
Vous pouvez aussi définir des règles de maquette personnalisées, par exemple :
- retourner
404siid = 0; - retourner une réponse spécifique pour un paramètre donné ;
- simuler un cas d’erreur ;
- préparer des scénarios frontend avant que le backend soit prêt.
Révision d’équipe et suivi des changements
Dans Apidog, les changements de spécification sont visibles dans l’espace de travail.
Pour un workflow "design-first", cela permet de :
- discuter d’un endpoint avant son implémentation ;
- commenter une réponse ou un champ ;
- suivre qui a modifié quoi ;
- éviter les changements silencieux de contrat ;
- aligner frontend et backend avant le développement.
Design-first vs. Code-first : les véritables compromis
Le "design-first" n’est pas toujours supérieur. Il dépend du contexte.
Avantages du "design-first"
- Le frontend et le backend peuvent travailler en parallèle.
- La documentation reste alignée avec le contrat.
- Les problèmes d’intégration apparaissent plus tôt.
- Les contrats API sont explicites.
- Les changements sont revus avant implémentation.
- Les tests peuvent valider automatiquement le respect du contrat.
Inconvénients du "design-first"
- Il faut définir la spécification avant de coder.
- L’équipe doit apprendre l’outil de spécification.
- Le workflow demande de la discipline.
- Une spécification trop détaillée trop tôt peut figer de mauvaises décisions.
Avantages du "code-first"
- Démarrage rapide pour les prototypes.
- Moins de processus pour un développeur solo.
- Pas besoin d’outil de conception séparé.
- Pratique pour explorer un domaine encore instable.
Inconvénients du "code-first"
- La documentation devient souvent secondaire.
- Le frontend doit attendre le backend.
- Les changements de contrat sont moins visibles.
- Les écarts entre code et documentation sont fréquents.
- La refactorisation demande des mises à jour manuelles.
En général, dès qu’une API implique plusieurs développeurs ou plusieurs consommateurs, le "design-first" devient plus rentable.
Outils supportant les workflows "design-first"
Apidog
Apidog fournit une plateforme complète pour concevoir, simuler, documenter, tester et réviser des API dans un seul outil.
Points clés :
- éditeur visuel ;
- génération de maquettes ;
- documentation ;
- tests ;
- collaboration d’équipe ;
- export OpenAPI.
Stoplight Studio
Stoplight Studio est un éditeur OpenAPI solide, avec Spectral pour le linting et la gouvernance des spécifications.
Il convient bien aux organisations qui veulent standardiser leurs pratiques OpenAPI, mais il ne couvre pas tous les besoins de maquette et de test dans un seul workflow.
SwaggerHub
SwaggerHub est une plateforme mature pour l’édition et la collaboration OpenAPI.
Elle est largement utilisée en entreprise et s’intègre bien dans l’écosystème Swagger. Ses capacités de maquette et de test sont toutefois plus limitées que celles d’une plateforme complète orientée "design-first".
Postman avec API Builder
Postman propose des fonctionnalités de conception d’API et de génération de spécifications OpenAPI.
Cependant, les workflows de conception, collections et maquettes peuvent sembler séparés. Il reste particulièrement adapté aux équipes qui utilisent déjà Postman pour tester et documenter leurs APIs.
Insomnia avec mode document
Insomnia prend en charge l’édition de spécifications OpenAPI et fournit des fonctionnalités de maquette de base.
C’est une option légère pour des développeurs individuels ou des petites équipes, mais moins complète pour un workflow "design-first" collaboratif.
Mettre en place un workflow "design-first" dans Apidog
Étape 1 : créer le projet depuis la spécification
Commencez par créer un projet API dans Apidog, puis ouvrez l’espace de conception.
Évitez de commencer par envoyer des requêtes manuelles. Définissez d’abord le contrat :
- endpoint ;
- méthode HTTP ;
- paramètres ;
- schéma de réponse ;
- codes d’erreur.
Étape 2 : définir les composants partagés
Avant d’ajouter tous les endpoints, créez les schémas réutilisables.
Exemples :
ErrorResponse:
type: object
required:
- code
- message
properties:
code:
type: string
message:
type: string
Pagination:
type: object
properties:
page:
type: integer
pageSize:
type: integer
total:
type: integer
Cela évite d’avoir plusieurs formats d’erreur ou de pagination dans la même API.
Étape 3 : créer un premier endpoint complet
Pour chaque endpoint, définissez au minimum :
- la méthode ;
- le chemin ;
- les paramètres obligatoires ;
- la réponse
200ou201; - les erreurs courantes (
400,401,404,422,500) ; - un exemple de réponse.
Exemple de réponse d’erreur :
{
"code": "USER_NOT_FOUND",
"message": "Utilisateur introuvable"
}
Étape 4 : partager l’URL de maquette
Dès que l’endpoint est défini, récupérez l’URL de maquette dans Apidog et partagez-la avec le frontend.
Le frontend peut alors intégrer l’API simulée :
const response = await fetch("https://mock.example.com/users/123");
const user = await response.json();
console.log(user.email);
Le backend peut avancer en parallèle sans bloquer l’interface.
Étape 5 : relire la documentation générée
Avant d’écrire le code backend, ouvrez la documentation générée.
Vérifiez :
- les noms de champs ;
- les descriptions ;
- les exemples ;
- les erreurs ;
- les contraintes ;
- les cas limites.
Si la documentation générée n’est pas exploitable, corrigez la spécification.
Étape 6 : verrouiller le contrat pour le sprint
Une fois la revue terminée, considérez la spécification comme stable pour le sprint.
Si une modification devient nécessaire :
- mettez à jour la spécification ;
- prévenez les consommateurs de l’API ;
- ajustez la maquette ;
- modifiez le backend ;
- relancez les tests.
Étape 7 : valider les réponses avec des tests
Après l’implémentation, ajoutez des tests pour vérifier que les réponses respectent les schémas.
Le but est simple :
API réelle == spécification OpenAPI
Dans une CI, ce type de validation sert de garde-fou contre les régressions de contrat.
FAQ
Le "design-first" est-il uniquement pour les API REST ?
Non. Le principe s’applique à tout système basé sur un contrat.
Exemples :
- REST avec OpenAPI ;
- GraphQL avec une approche schema-first ;
- gRPC avec protobuf ;
- systèmes événementiels avec AsyncAPI.
Apidog supporte la conception REST et GraphQL. Pour gRPC, les fichiers proto jouent un rôle similaire de contrat initial.
Faut-il définir toute l’API avant de commencer ?
Non.
Vous pouvez appliquer le "design-first" fonctionnalité par fonctionnalité.
Exemple :
Sprint actuel → définir uniquement les endpoints nécessaires à cette fonctionnalité
L’adoption incrémentale est souvent plus réaliste que la migration complète d’un seul coup.
Comment intégrer le "design-first" dans un sprint agile ?
Une approche simple :
- concevoir le contrat en début de sprint ;
- faire relire par le frontend et le backend ;
- générer la maquette ;
- développer en parallèle ;
- valider l’implémentation contre la spécification.
La revue de spécification devient alors une partie de la planification technique.
Que faire si l’implémentation doit s’écarter de la spécification ?
Cela arrive.
Le bon ordre est :
- modifier la spécification ;
- faire valider le changement ;
- mettre à jour la maquette ;
- modifier l’implémentation ;
- adapter les tests.
L’objectif est de garder la spécification comme source de vérité.
Peut-on générer des stubs serveur depuis l’export OpenAPI d’Apidog ?
Oui. Exportez la spécification en OpenAPI 3.x, puis utilisez un générateur standard comme openapi-generator.
Exemple :
openapi-generator-cli generate \
-i openapi.yaml \
-g nodejs-express-server \
-o ./server-stub
openapi-generator prend en charge de nombreux langages et frameworks.
Comment gérer le versionnement des spécifications ?
Apidog conserve l’historique des changements dans un projet.
Pour des versions majeures maintenues en parallèle, par exemple v1 et v2, vous pouvez utiliser des projets ou branches séparés selon l’organisation de votre équipe.
Conclusion
Le "design-first" réduit les surprises d’intégration en rendant le contrat API explicite dès le début.
Le workflow recommandé est simple :
- définir la spécification ;
- générer la maquette ;
- partager la documentation ;
- implémenter contre le contrat ;
- valider automatiquement les réponses.
L’investissement initial est faible si l’outil rend la conception rapide. C’est précisément le rôle d’une plateforme comme Apidog : centraliser la spécification, les maquettes, la documentation, les tests et la collaboration pour rendre le "design-first" pratique au quotidien.
Top comments (0)