Utiliser JSON dans les API REST : bonnes pratiques
JSON dans les API REST
JSON et les API REST sont faits l'un pour l'autre. La syntaxe légÚre de JSON, sa prise en charge native des tableaux et son support universel dans tous les langages en font le format par défaut des API web modernes. Mais simplement utiliser JSON dans votre API ne suffit pas -- suivre les conventions établies et les bonnes pratiques garantit que votre API est cohérente, intuitive et facile à intégrer.
Format des requĂȘtes et des rĂ©ponses
Structure d'enveloppe cohérente
Adoptez une enveloppe JSON cohérente pour toutes les réponses de l'API. Cela rend le traitement cÎté client prévisible et simplifie la gestion des erreurs.
{
"status": "success",
"data": {
"user": {
"id": 123,
"name": "Alice",
"email": "alice@example.com"
}
},
"meta": {
"requestId": "req-a1b2c3d4",
"timestamp": "2026-07-19T10:30:00Z"
}
}
Snake Case contre Camel Case
Choisissez une convention de nommage et tenez-vous-y dans toute votre API :
- Camel Case (
createdAt,firstName) : Courant dans les écosystÚmes JavaScript/TypeScript - Snake Case (
created_at,first_name) : Courant dans les écosystÚmes Python, Ruby et PHP
Quel que soit votre choix, documentez-le clairement et envisagez d'utiliser une couche de transformation si votre langage backend utilise une convention différente.
Codes de statut HTTP avec JSON
Des codes de statut HTTP appropriés complÚtent vos réponses JSON. Utilisez-les de maniÚre cohérente :
| Code de statut | Signification | Quand l'utiliser |
|-------------|---------|-------------|
| 200 OK | SuccĂšs | SuccĂšs de GET, PUT, PATCH |
| 201 Created | Ressource créée | SuccÚs de POST |
| 204 No Content | Suppression réussie | SuccÚs de DELETE (aucun corps JSON) |
| 400 Bad Request | Syntaxe JSON invalide | Corps de requĂȘte malformĂ© |
| 401 Unauthorized | Authentification requise | Jeton manquant ou invalide |
| 403 Forbidden | Permissions insuffisantes | Authentification valide mais non autorisée |
| 404 Not Found | La ressource n'existe pas | ID ou chemin invalide |
| 422 Unprocessable Entity | Ăchec de validation | Erreurs sĂ©mantiques dans un JSON valide |
| 429 Too Many Requests | Limite de débit atteinte | Le client dépasse les limites |
| 500 Internal Server Error | Défaillance cÎté serveur | Erreurs inattendues |
Format de réponse d'erreur standard
{
"status": "error",
"error": {
"code": "VALIDATION_ERROR",
"message": "The request body contains invalid fields",
"details": [
{
"field": "email",
"message": "Must be a valid email address",
"code": "INVALID_FORMAT"
},
{
"field": "age",
"message": "Must be a positive integer",
"code": "OUT_OF_RANGE"
}
]
}
}
Ressources imbriquées
Représenter les relations
Les API REST doivent fréquemment représenter des ressources liées. Voici des modÚles courants :
Intégré (chargement anticipé) :
{
"order": {
"id": 5001,
"total": 29.99,
"customer": {
"id": 123,
"name": "Alice",
"email": "alice@example.com"
},
"items": [
{
"productId": 42,
"name": "Widget",
"quantity": 2,
"price": 14.99
}
]
}
}
Référencé (chargement paresseux) -- utilisez des IDs et fournissez des points de terminaison séparés :
{
"order": {
"id": 5001,
"total": 29.99,
"customerId": 123,
"itemIds": [101, 102]
}
}
RÚgle générale : Intégrez les données liées qui sont toujours nécessaires ensemble. Référencez les données récupérées conditionnellement ou à un moment différent.
ModĂšles de pagination
Lorsque vous renvoyez des listes de ressources, la pagination est essentielle. Utilisez un format de pagination cohérent :
Pagination basée sur l'offset
{
"status": "success",
"data": [
{ "id": 1, "name": "User 1" },
{ "id": 2, "name": "User 2" }
],
"pagination": {
"page": 1,
"perPage": 20,
"totalItems": 156,
"totalPages": 8,
"links": {
"first": "/api/users?page=1&perPage=20",
"prev": null,
"next": "/api/users?page=2&perPage=20",
"last": "/api/users?page=8&perPage=20"
}
}
}
Pagination basée sur un curseur (recommandée pour les grands ensembles de données)
{
"status": "success",
"data": [
{ "id": 100, "name": "User 100" },
{ "id": 101, "name": "User 101" }
],
"pagination": {
"nextCursor": "eyJpZCI6MTAxfQ==",
"hasMore": true
}
}
La pagination basĂ©e sur un curseur est plus fiable pour les donnĂ©es en temps rĂ©el oĂč de nouveaux enregistrements pourraient dĂ©caler les limites des pages.
JSON dans les requĂȘtes API
Corps de requĂȘtes POST / PUT
Acceptez le JSON avec l'en-tĂȘte Content-Type: application/json :
{
"title": "New Blog Post",
"content": "This is the content...",
"tags": ["json", "rest-api"],
"published": false
}
Mises Ă jour partielles avec PATCH
Utilisez PATCH pour les mises Ă jour partielles. N'acceptez que les champs qui doivent changer :
// PATCH /api/users/123
{
"email": "newemail@example.com"
}
Filtrage, tri et recherche
Utilisez des paramĂštres de requĂȘte pour la manipulation des donnĂ©es, afin de garder le corps JSON propre :
GET /api/users?filter[role]=admin&sort=-createdAt&search=alice
{
"status": "success",
"data": [ /* filtered, sorted results */ ]
}
Limitation du débit
Incluez les informations de limitation de dĂ©bit dans les en-tĂȘtes de rĂ©ponse et Ă©ventuellement dans le corps JSON :
{
"status": "error",
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Too many requests. Please try again later."
},
"meta": {
"rateLimit": {
"limit": 100,
"remaining": 0,
"resetAt": "2026-07-19T11:00:00Z"
}
}
}
Liste de contrĂŽle des bonnes pratiques JSON
- [ ] Utilisez un nommage de clés cohérent (camelCase ou snake_case partout)
- [ ] Renvoyez des codes de statut HTTP appropriés avec chaque réponse
- [ ] Incluez un format d'erreur cohérent avec des codes d'erreur lisibles par machine
- [ ] Paginez les points de terminaison de listes avec un objet de pagination standardisé
- [ ] Utilisez JSON Schema pour documenter et valider les structures de requĂȘtes/rĂ©ponses
- [ ] Définissez
Content-Type: application/jsonsur tous les points de terminaison JSON - [ ] Compressez les réponses JSON avec gzip ou brotli en production
- [ ] Appliquez des limites maximales de taille de charge utile (par exemple, 1 Mo par défaut)
- [ ] Utilisez HTTPS pour chiffrer les données JSON en transit
- [ ] Structurez les détails des erreurs pour aider les clients à déboguer sans exposer les éléments internes
Valider votre JSON d'API
Faites passer vos réponses API par un validateur JSON pour détecter les erreurs de formatage avant qu'elles n'atteignent les clients. Des réponses JSON cohérentes et valides rendent votre API fiable et conviviale pour les développeurs. Utilisez notre outil Formateur et validateur JSON pour tester vos charges utiles pendant le développement.