REST · HTTP · Ressources · Richardson

Comprendre REST

REST est une manière de concevoir des APIs web en s’appuyant sur les ressources, les URLs, les méthodes HTTP, les codes de réponse et les liens entre ressources.

Objectif de la page
  • Comprendre l’idée générale de REST
  • Différencier ressource, URL et représentation
  • Associer les méthodes HTTP aux bonnes actions
  • Comprendre le modèle de Richardson

Introduction

REST, en une idée simple

REST signifie Representational State Transfer. C’est un style d’architecture pour concevoir des services web. Une API REST expose des ressources accessibles par des URLs, puis utilise les méthodes HTTP pour lire, créer, modifier ou supprimer ces ressources.

Une ressource peut être un utilisateur, un article, une commande, un commentaire, un produit ou tout autre élément métier manipulé par une application.

Exemple : dans une API de boutique en ligne, les produits peuvent être représentés par l’URL /products, et un produit précis par /products/42.

REST n’est pas un framework, ni un langage, ni une librairie. C’est une manière d’organiser les échanges entre un client et un serveur en respectant des conventions simples, prévisibles et compréhensibles.

Notion fondamentale

Ressource, URL et représentation

Pour comprendre REST, il faut distinguer trois notions : la ressource, son URL et sa représentation.

Ressource

C’est l’élément métier manipulé : un utilisateur, un produit, une commande, un article.

URL

C’est l’adresse qui permet d’identifier la ressource sur le web.

Représentation

C’est la forme renvoyée au client, par exemple du JSON, du XML ou du HTML.

Une même ressource peut avoir plusieurs représentations. Par exemple, un utilisateur peut être affiché sous forme de page HTML dans un navigateur, ou retourné sous forme de JSON dans une API.

Exemple de représentation JSON JSON
{
  "id": 42,
  "name": "Alice Martin",
  "email": "alice@example.com"
}

Principes

Les grands principes de REST

REST repose sur plusieurs contraintes d’architecture. Elles permettent de créer des APIs compréhensibles, évolutives et faciles à consommer.

Le client et le serveur ont des responsabilités séparées. Le client s’occupe de l’interface et de l’expérience utilisateur. Le serveur gère les données, les règles métier et les réponses. Cette séparation permet de faire évoluer le front-end et le back-end indépendamment.

Chaque requête doit contenir toutes les informations nécessaires pour être comprise. Le serveur ne doit pas dépendre d’un état de conversation caché entre deux requêtes. Cela ne veut pas dire qu’il n’y a jamais d’authentification, mais que le client doit envoyer les informations utiles à chaque appel, par exemple un token.

Les réponses peuvent indiquer si elles sont cacheables ou non. Le cache peut améliorer les performances, réduire la charge serveur et éviter de transférer plusieurs fois les mêmes données.

Les ressources doivent être identifiées de manière stable par des URLs. Les actions doivent utiliser les méthodes HTTP de façon cohérente : GET pour lire, POST pour créer, PUT pour remplacer, PATCH pour modifier partiellement, DELETE pour supprimer.

Le client n’a pas besoin de savoir s’il communique directement avec le serveur final ou avec un intermédiaire comme un proxy, un cache, une passerelle ou un répartiteur de charge. Cette contrainte facilite les architectures distribuées.

Méthodes HTTP

Quelle méthode utiliser ?

Dans une API REST, on évite de mettre l’action dans l’URL. L’URL désigne la ressource, et la méthode HTTP indique l’action.

GET

Lire

GET sert à lire une ressource ou une collection de ressources. Une requête GET ne doit pas modifier l’état du serveur.

  • Exemple : GET /users
  • Exemple : GET /users/42
  • Codes fréquents : 200, 304, 404

POST

Créer

POST sert généralement à créer une ressource dans une collection, ou à soumettre un traitement qui ne correspond pas à un simple remplacement.

  • Exemple : POST /users
  • Body généralement nécessaire
  • Codes fréquents : 201, 202, 400, 422

PUT

Remplacer

PUT sert à remplacer complètement la ressource ciblée par l’URL. La requête contient normalement la représentation complète de la ressource.

  • Exemple : PUT /users/42
  • Peut retourner 200 ou 204 si la ressource existait
  • Peut retourner 201 si la ressource est créée à cette URI

PATCH

Modifier

PATCH sert à modifier partiellement une ressource. Contrairement à PUT, on envoie uniquement les champs à modifier.

  • Exemple : PATCH /users/42
  • Body nécessaire
  • Codes fréquents : 200, 204, 400, 404, 422

DELETE

Supprimer

DELETE sert à supprimer la ressource ciblée par l’URL. Lorsque la suppression réussit sans contenu à retourner, 204 No Content est fréquent.

  • Exemple : DELETE /users/42
  • Codes fréquents : 200, 202, 204, 404

HEAD · OPTIONS

Diagnostic

HEAD demande les mêmes headers qu’un GET, mais sans le corps. OPTIONS permet de connaître les méthodes ou headers autorisés.

  • HEAD : vérifier l’existence ou les métadonnées
  • OPTIONS : découvrir les capacités d’une ressource
  • Très utile pour le CORS et le diagnostic HTTP

Notions importantes

Méthodes sûres et méthodes idempotentes

Deux notions sont très utiles pour comprendre les méthodes HTTP : les méthodes sûres et les méthodes idempotentes.

Méthode sûre

Une méthode est dite sûre lorsqu’elle ne doit pas modifier l’état de la ressource.

Exemple : GET est une méthode sûre, car elle sert à lire.

Méthode idempotente

Une méthode est idempotente si plusieurs appels identiques produisent le même résultat final qu’un seul appel.

Exemple : supprimer plusieurs fois la même ressource ne change pas davantage le résultat final.

Méthode Sûre ? Idempotente ? Remarque
GET Oui Oui Lecture sans modification attendue.
POST Non Non en général Plusieurs appels peuvent créer plusieurs ressources.
PUT Non Oui Remplace la ressource par le même état final.
PATCH Non Pas toujours Dépend du type de modification appliquée.
DELETE Non Oui La ressource finit supprimée.

Codes HTTP

Associer les bonnes réponses aux bonnes situations

Une API REST ne doit pas retourner 200 OK pour toutes les situations. Le code HTTP aide le client à comprendre le résultat réel de la requête.

Situation Code fréquent Explication
Lecture réussie 200 OK La ressource ou la collection est retournée.
Création réussie 201 Created Une nouvelle ressource a été créée.
Traitement accepté mais différé 202 Accepted La requête est acceptée, mais le traitement n’est pas terminé.
Succès sans contenu 204 No Content La requête a réussi, mais aucune réponse JSON n’est renvoyée.
Requête mal formée 400 Bad Request La syntaxe ou la structure de la requête est incorrecte.
Authentification absente ou invalide 401 Unauthorized Le client doit fournir une authentification valide.
Droits insuffisants 403 Forbidden Le client est connu, mais n’a pas le droit d’accéder à la ressource.
Ressource introuvable 404 Not Found L’URL ou l’identifiant ne correspond à aucune ressource.
Méthode non autorisée 405 Method Not Allowed L’URL existe, mais pas pour cette méthode HTTP.
Conflit avec l’état actuel 409 Conflict La requête est incompatible avec l’état de la ressource.
Erreur de validation 422 Unprocessable Content Le JSON est valide, mais les données ne respectent pas les règles attendues.
Erreur serveur 500 Internal Server Error Le serveur rencontre un problème inattendu.

Conventions d’URL

Construire des URLs RESTful

Une URL RESTful doit identifier une ressource de manière claire, stable et prévisible. Elle doit privilégier les noms de ressources plutôt que les verbes d’action.

Utiliser des noms

  • Correct : /users
  • À éviter : /getUsers

Utiliser les identifiants

  • Collection : /users
  • Ressource précise : /users/42

Utiliser les sous-ressources

  • /users/42/orders
  • /products/12/reviews

Utiliser les paramètres pour filtrer

  • /products?category=books
  • /products?page=2&limit=20
Exemple d’ensemble cohérent RESTful
GET    /users
POST   /users
GET    /users/42
PUT    /users/42
PATCH  /users/42
DELETE /users/42

JSON

Représentations et formats de réponse

REST ne limite pas les réponses à JSON. Une ressource peut être représentée en HTML, XML, JSON ou dans un autre format. En pratique, les APIs web modernes utilisent très souvent JSON, car il est simple à lire et facile à manipuler en JavaScript.

Une bonne représentation doit être claire, prévisible et cohérente. Les noms de champs doivent être stables, les relations doivent être compréhensibles, et les erreurs doivent avoir un format régulier.

Ressource JSON Exemple
{
  "id": 42,
  "title": "Découvrir REST",
  "content": "Une ressource est retournée sous forme de représentation JSON.",
  "author": {
    "id": 7,
    "href": "/users/7"
  }
}

Lorsqu’une API retourne une erreur, le format devrait également rester cohérent. Le client peut alors traiter les erreurs plus facilement.

Maturité REST

Le modèle de maturité de Richardson

Le modèle de Richardson permet d’évaluer progressivement la maturité REST d’une API. Il ne remplace pas les contraintes REST, mais il donne une grille de lecture très utile pour comprendre les étapes d’amélioration d’une API HTTP.

Niveau 0

RPC sur HTTP

L’API utilise HTTP comme simple tunnel. Elle expose souvent une seule URL, puis indique l’action dans le corps ou dans un paramètre.

POST /api
{
  "action": "getUser",
  "id": 42
}
Niveau 1

Ressources

L’API commence à exposer des ressources avec des URLs distinctes. Les ressources sont mieux identifiées, mais les méthodes HTTP ne sont pas forcément utilisées de façon complète.

POST /users/42
POST /orders/15
Niveau 2

Méthodes et codes HTTP

L’API utilise correctement les méthodes HTTP et les codes de réponse. L’intention de la requête est portée par la méthode, pas par un verbe dans l’URL.

GET    /users/42
PUT    /users/42
DELETE /users/42
Niveau 3

Hypermédia

Les réponses contiennent des liens permettant au client de découvrir les actions possibles et les ressources liées. C’est le principe souvent appelé HATEOAS.

{
  "id": 42,
  "name": "Alice",
  "_links": {
    "self": { "href": "/users/42" },
    "orders": { "href": "/users/42/orders" }
  }
}
À retenir : une API peut utiliser HTTP sans être vraiment RESTful. Plus elle identifie clairement ses ressources, utilise correctement les méthodes HTTP et expose des liens utiles, plus elle se rapproche d’une API REST mature.

Erreurs

Répondre proprement en cas d’erreur

Une API REST doit aussi être claire lorsqu’une requête échoue. Le code HTTP indique la catégorie de problème, mais le corps de réponse peut fournir un message plus précis.

Exemple de réponse d’erreur 404
{
  "code": 404,
  "message": "Ressource introuvable"
}

L’important est de garder un format stable. Le client peut ainsi afficher un message, déclencher une redirection, demander une nouvelle authentification ou corriger les données envoyées.

Synthèse

Bonnes pratiques à retenir

À faire

  • Identifier les ressources avec des URLs claires.
  • Utiliser les méthodes HTTP selon leur rôle.
  • Retourner des codes HTTP précis.
  • Garder des formats JSON cohérents.
  • Documenter les paramètres, réponses et erreurs.

À éviter

  • Mettre des verbes d’action dans les URLs.
  • Retourner 200 pour toutes les situations.
  • Utiliser POST pour toutes les opérations.
  • Changer souvent la structure des réponses.
  • Retourner des erreurs sans message exploitable.
Résumé : REST consiste à manipuler des ressources identifiées par des URLs, avec les méthodes HTTP adaptées, des codes de réponse précis, et des représentations lisibles.