Conception d'APIs REST
Bonnes Pratiques &
Standards
Référence Complète pour Développeurs Backend
Auteur : Équipe Ingénierie | Version : 4.0 | Mai 2026
1. Principes REST (Richardson Maturity Model)
Niveau Nom Description Exemple
0 POX (Plain Old XML) Un seul endpoint, un seul POST
verbe /api avec action dans le corps
1 Ressources Un endpoint par ressource GET /users, POST /orders
2 Verbes HTTP Utilisation sémantique des méthodes
GET/POST/PUT/DELETE/PATCH
3 HATEOAS Liens hypermédias dans les réponses
Découverte dynamique de l'API
2. Méthodes HTTP & Usage
Méthode Action Idempotent Corps Réponse typique
GET Lire une ressource Oui Non 200 OK + données
POST Créer une ressource Non Oui 201 Created + location
PUT Remplacer une ressource Oui Oui 200 OK ou 204
PATCH Modifier partiellement Non Oui 200 OK + données
DELETE Supprimer une ressource Oui Non 204 No Content
HEAD Métadonnées uniquement Oui Non 200 OK (sans corps)
OPTIONS Capacités du serveur Oui Non 200 + Allow header
3. Codes de Statut HTTP
Code Signification Quand l'utiliser
200 OK Requête réussie avec données en réponse
201 Created Ressource créée avec succès (POST)
204 No Content Succès sans données à retourner (DELETE)
400 Bad Request Données invalides ou malformées
401 Unauthorized Authentification requise ou invalide
403 Forbidden Autorisé mais non autorisé à cette ressource
404 Not Found Ressource introuvable
409 Conflict Conflit (doublon, état incompatible)
422 Unprocessable Entity Données syntaxiquement correctes mais invalides
429 Too Many Requests Rate limiting dépassé
500 Internal Server Error Erreur serveur inattendue
503 Service Unavailable Service temporairement indisponible
[Link]
Exemple d'Implémentation (FastAPI)
fastapi import FastAPI, HTTPException, status from pydantic import BaseModel
from typing import Optional app = FastAPI(title='API Utilisateurs', version='1.0.0')
class UserCreate(BaseModel): name: str email: str role: Optional[str] = 'user'
@[Link]('/users/{user_id}', response_model=UserCreate) async def get_user(user_id:
int): user = [Link](user_id) if not user: raise HTTPException(status_code=404,
detail='Utilisateur introuvable') return user @[Link]('/users',
response_model=UserCreate, status_code=201) async def create_user(user: UserCreate):
return [Link]([Link]())
5. Sécurité & Versioning
Sécurité des APIs
• Utiliser HTTPS exclusivement (TLS 1.2 minimum)
• Implémenter l'authentification JWT (access + refresh tokens)
• Ajouter le rate limiting (ex : 100 req/min par IP/token)
• Valider et assainir toutes les entrées côté serveur
• Journaliser les accès avec corrélation des requêtes (trace ID)
• Utiliser des en-têtes de sécurité (CORS, HSTS, X-Content-Type-Options)
Stratégies de Versioning
Stratégie Exemple Avantages Inconvénients
URL Path /api/v1/users Visible, simple, cacheable Prolifération d'URLs
Header Accept: application/[Link].v2+json URLs propres Moins visible, complexe
Query param /users?version=2 Facile à tester Moins RESTful