Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 27

Concevoir une API RESTful conforme aux conventions

Recommended resources

Bonjour ! Dans la leçon précédente, nous avons exploré le monde des bases de données NoSQL en intégrant Spring Data MongoDB à notre application. Vous avez vu à quel point l'écosystème Spring simplifie le travail avec différents types de bases de données tout en conservant une architecture cohérente.

Nous avons maintenant une base solide pour la persistance des données, que ce soit en SQL avec JPA ou en NoSQL avec MongoDB. Il est temps de passer à la couche supérieure : comment exposer ces données de manière professionnelle et standardisée au monde extérieur.

Bienvenue dans le module 5, dédié à la conception d'APIs REST professionnelles. L'objectif de cette première leçon est de concevoir une API REST en respectant les conventions fondamentales : nommage des ressources, verbes HTTP et codes de statut.

En tant que développeur web, vous interagissez quotidiennement avec des APIs. Aujourd'hui, nous allons formaliser les principes qui distinguent une API fonctionnelle d'une API professionnelle : une API intuitive, prévisible et facile à maintenir.

1. Qu'est-ce qu'une API REST ? Les fondations

Avant de plonger dans les détails, assurons-nous de partager un vocabulaire commun. REST (Representational State Transfer) n'est pas une technologie, mais un style d'architecture qui définit un ensemble de contraintes pour la création de services web.

La vidéo suivante offre une excellente introduction aux concepts fondamentaux d'une API et à l'architecture REST.

Amina Chakir - Les API REST

Regardons "Les API REST" par Amina Chakir. Cette première partie définit ce qu'est une API, explique le modèle client-serveur avec une analogie parlante (le restaurant) et introduit REST comme l'approche la plus populaire.

Regardez la vidéo du début jusqu'à 5:38. Concentrez-vous sur la compréhension des rôles du client et du serveur, et sur la raison pour laquelle REST s'appuie sur le protocole HTTP que vous connaissez déjà bien.

Pour résumer, une API RESTful est une interface qui :

  • S'organise autour des ressources (des "choses", comme des utilisateurs, des produits, des commandes).
  • Utilise des identifiants uniques (URIs) pour accéder à ces ressources.
  • Communique via le protocole HTTP standard, en exploitant ses méthodes (verbes) et ses codes de statut.
  • Est sans état (stateless) : chaque requête du client doit contenir toutes les informations nécessaires pour être comprise par le serveur, sans que ce dernier ait besoin de se souvenir des requêtes précédentes.

2. Les piliers d'une conception RESTful

Une API bien conçue repose sur le respect de conventions claires. Nous allons nous concentrer sur les trois plus importantes : le nommage des URIs, l'utilisation des verbes HTTP et le retour de codes de statut appropriés.

2.1. Nommage des ressources : les URIs

La règle d'or est simple : une URI identifie une ressource (un nom), pas une action (un verbe). L'action sera définie par le verbe HTTP utilisé.

Pour approfondir ces conventions de nommage, je vous propose de lire deux ressources complémentaires. La première, de Microsoft, est une référence technique, et la seconde, du blog OCTO, offre une perspective pragmatique.

Meilleures pratiques pour la conception de l’API web RESTful

L'article "Meilleures pratiques pour la conception de l'API web RESTful" de Microsoft Azure est une excellente ressource de référence. Lisons les sections qui concernent spécifiquement le nommage des URIs.

Lisez les sections "Définir des URI de ressource d’API web RESTful" et "Conventions de nommage des URI de ressources". Elles expliquent pourquoi il faut utiliser des noms et comment structurer les URIs pour les collections et les éléments individuels.

Designer une API REST - OCTO Talks !

L'article "Designer une API REST" du blog OCTO synthétise très bien ces pratiques. Il est plus direct et vous donnera des règles claires à appliquer.

Lisez les sections 3.1 "Noms > verbes" et 3.2 "Pluriel > singulier". Elles renforcent les mêmes concepts avec des exemples concrets.

Synthèse des conventions de nommage des URIs :

  • Utilisez des noms, pas des verbes.
    • Bien : GET /orders/123
    • À éviter : GET /getOrderById?id=123
  • Utilisez des noms au pluriel pour les collections.
    • /users, /products, /clients
  • Utilisez le format /collection/{id} pour un élément spécifique.
    • /users/42 : pour récupérer l'utilisateur avec l'ID 42.
  • Pour les ressources imbriquées, suivez la hiérarchie.
    • /clients/3/orders : pour lister toutes les commandes du client 3.
  • Soyez cohérent avec la casse. Le spinal-case (ex: ma-ressource) est courant, tout comme le snake_case (ma_ressource). Le plus important est de choisir un style et de s'y tenir.

2.2. Choisir la bonne action : les verbes HTTP

Maintenant que nos URIs identifient les ressources, nous utilisons les verbes (ou méthodes) HTTP pour dire ce que nous voulons faire avec elles. Cela correspond aux opérations CRUD (Create, Read, Update, Delete) que vous connaissez.

Mapping CRUD Operations to HTTP Methods
Cette image illustre la correspondance directe entre les opérations CRUD et les verbes HTTP, qui est au cœur de la conception REST.

Le tableau suivant, tiré de l'article d'OCTO, est un résumé parfait de la manière de mapper ces opérations.

Designer une API REST - OCTO Talks !

Retournons à l'article d'OCTO pour une synthèse parfaite. La section "CRUD" contient un tableau qui est un excellent aide-mémoire.

Étudiez la section 3.4 "CRUD". Concentrez-vous sur le tableau qui synthétise l'utilisation des verbes GET, POST, PUT, PATCH et DELETE sur une collection (ex: /orders) et sur une instance (ex: /orders/{id}).

Synthèse des verbes HTTP :

Verbe Opération Cible Description Idempotent ?
GET Read Collection ou Instance Récupérer une liste de ressources ou une ressource unique. Oui
POST Create Collection Créer une nouvelle ressource. Le serveur génère l'ID. Non
PUT Update/Replace Instance Remplacer entièrement une ressource existante. Peut aussi créer si l'ID est fourni par le client. Oui
PATCH Update/Modify Instance Mettre à jour partiellement une ressource existante. Non
DELETE Delete Instance Supprimer une ressource. Oui

Une opération est idempotente si le fait de l'appeler plusieurs fois de suite avec les mêmes paramètres a le même effet que de l'appeler une seule fois. Par exemple, supprimer un utilisateur avec DELETE /users/42 une fois ou dix fois donne le même résultat final : l'utilisateur 42 n'existe plus.

2.3. Communiquer le résultat : les codes de statut HTTP

Une fois que le serveur a traité la requête, il doit informer le client du résultat. C'est le rôle des codes de statut HTTP. Utiliser le bon code est essentiel pour que le client puisse réagir de manière appropriée (afficher un succès, une erreur, tenter de se ré-authentifier, etc.).

Les articles de Microsoft et d'OCTO que vous avez consultés contiennent des listes détaillées de ces codes.

Designer une API REST - OCTO Talks !

Pour finir la partie théorique, revoyons les codes de statut. La section "Status Codes" de l'article d'OCTO est particulièrement claire et couvre les cas les plus courants.

Lisez la section 5.6 "Status Codes". Repérez les codes les plus importants des catégories SUCCESS (2xx), CLIENT ERROR (4xx) et SERVER ERROR (5xx).

Les codes de statut essentiels :

  • Succès (2xx)
    • 200 OK : Succès général pour GET, PUT, PATCH.
    • 201 Created : La ressource a été créée avec succès (POST). La réponse doit inclure un en-tête Location avec l'URI de la nouvelle ressource.
    • 204 No Content : Succès, mais il n'y a pas de contenu à renvoyer (souvent pour DELETE).
  • Erreur client (4xx)
    • 400 Bad Request : La requête du client est malformée (ex: JSON invalide, paramètre manquant).
    • 401 Unauthorized : Le client doit s'authentifier pour accéder à la ressource.
    • 403 Forbidden : Le client est authentifié mais n'a pas les droits pour effectuer cette action.
    • 404 Not Found : La ressource demandée n'existe pas.
  • Erreur serveur (5xx)
    • 500 Internal Server Error : Une erreur inattendue s'est produite côté serveur.

3. De la théorie à la pratique avec Spring Boot

Comment ces principes se traduisent-ils en code dans un projet Spring Boot ? L'écosystème Spring nous fournit des annotations qui correspondent directement à ces conventions.

La vidéo suivante est un tutoriel complet de création d'une application CRUD. Nous n'allons pas la suivre en entier, mais nous allons l'utiliser comme une référence pour voir comment les conventions REST sont implémentées.

Application CRUD en 30 minutes | Tutoriel Étape par Étape | Spring Boot | MySQL

La vidéo "Application CRUD en 30 minutes" par Coding With Armand est un excellent exemple pratique. Nous allons la parcourir pour voir la traduction concrète des concepts que nous venons d'aborder en code Spring Boot.

Parcourez les sections suivantes pour voir la mise en œuvre de chaque convention : URI de base (17:38 - 19:07) : L'auteur utilise @RestController et @RequestMapping("/api/personnes"). Notez l'URI au pluriel pour la collection. GET All (20:52 - 24:05) : Il utilise @GetMapping sans chemin additionnel sur la collection. La méthode retourne une ResponseEntity avec le statut HttpStatus.OK (200). POST (25:07 - 27:10) : Il utilise @PostMapping et @RequestBody pour recevoir les données. La méthode retourne un statut HttpStatus.CREATED (201). GET by ID (28:03 - 31:39) : Il utilise @GetMapping("/{id}") et @PathVariable pour extraire l'ID. La méthode gère les deux cas : OK (200) si trouvé, NOT_FOUND (404) sinon. PUT (32:26 - 36:56) : Il combine @PutMapping("/{id}"), @PathVariable et @RequestBody. Le code de retour est OK (200) en cas de succès et NOT_FOUND (404) si l'instance n'existe pas. DELETE (36:56 - 39:53) : Il utilise @DeleteMapping("/{id}") et @PathVariable. Le code de retour est OK (200) ou NOT_FOUND (404). Note : un 204 No Content serait également un excellent choix ici.

Cette vidéo illustre parfaitement l'architecture cible de nos APIs :

Spring Boot Application Architecture Diagram
Cette image montre le flux d'une requête : le client (Postman) envoie une requête à un `Controller` qui orchestre l'appel à une couche `Service` (logique métier) et `Repository` (accès aux données). C'est exactement ce que nous allons construire.

Conclusion

Aujourd'hui, nous avons posé les fondations indispensables à la création d'APIs REST professionnelles. En respectant ces conventions, vous ne vous facilitez pas seulement la vie, vous créez surtout des services que d'autres développeurs pourront comprendre et utiliser intuitivement.

Les points clés à retenir :

  1. URIs avec des Noms : Les URIs représentent des ressources (noms, au pluriel) et leur hiérarchie (/clients, /clients/{id}).
  2. Actions avec des Verbes HTTP : GET pour lire, POST pour créer, PUT/PATCH pour mettre à jour, DELETE pour supprimer.
  3. Résultats avec des Codes de Statut : Utilisez les codes HTTP (2xx, 4xx, 5xx) pour communiquer clairement le résultat de chaque opération.
  4. Spring Boot facilite l'implémentation de ces conventions grâce à des annotations dédiées (@RestController, @GetMapping, @PostMapping, ResponseEntity, etc.).

Dans la prochaine leçon, nous mettrons tout cela en pratique. L'objectif sera d'implémenter les opérations CRUD complètes pour une ressource, en créant vous-même un Controller qui respecte scrupuleusement les principes vus aujourd'hui. Préparez-vous à coder