HTTP et idempotence : quand peut-on réessayer une requête ?
Une réponse perdue ne signifie pas que l’opération a échoué. Méthodes HTTP, clés d’idempotence et suivi du résultat aident à réessayer sans créer de doublon.
Article
REST décrit des contraintes d’architecture pour faire évoluer clients et serveurs. HTTP et JSON ne suffisent pas : les liens, le cache et les contrats comptent.
Une API renvoie des commandes en JSON et utilise GET ou POST. Ces choix ne disent pas encore comment ses clients découvrent les actions, utilisent le cache ou résistent aux évolutions du serveur. REST décrit cet ensemble de règles d'architecture. Comprendre leur rôle permet de choisir ce que votre API doit garantir, au-delà du format de ses réponses.
Un style d'architecture est un ensemble de règles choisies pour obtenir certaines propriétés. REST, pour Representational State Transfer, décrit notamment la séparation entre clients et serveurs, l'usage du cache et une interface commune. Roy Fielding l'a formalisé dans sa thèse publiée en 2000.
Le travail de Fielding accompagne l'évolution du Web et de HTTP dans les années 1990. Sa thèse décrit comment les contraintes ont guidé ces choix. Cette histoire aide à comprendre pourquoi le navigateur, les liens et les intermédiaires réseau occupent autant de place dans REST.
Fielding a participé aux spécifications de HTTP et des URI, les identifiants des ressources. REST met en relation leurs mécanismes avec les propriétés recherchées : permettre à des composants développés séparément de communiquer et d'évoluer.
HTTP définit les échanges sur le réseau : méthodes, statuts et en-têtes. JSON est un format de données. REST décrit l'organisation du système. Une API peut utiliser HTTP et JSON sans respecter toutes les contraintes de REST.
Pour comprendre une API, examinez donc aussi les informations autour des données : règles de cache, sens des opérations et liens proposés. Elles déterminent ce qu'un client ou un intermédiaire peut faire sans connaître l'implémentation du serveur.
Chacune retire une liberté et apporte en échange une propriété concrète.
| Contrainte | Ce qu'elle interdit | Ce qu'elle apporte |
|---|---|---|
| Client-serveur | lier l'interface au stockage des données | les deux évoluent séparément |
| Sans état | un contexte de session client nécessaire, conservé entre les requêtes | chaque requête peut être comprise indépendamment des précédentes |
| Cacheable | taire la durée de validité d'une réponse | des intermédiaires répondent à la place du serveur |
| Interface uniforme | un mode d'accès taillé pour chaque type de ressource | un client générique ; c'est la contrainte centrale du style. Fielding en nomme aussi le prix : elle « dégrade l'efficacité », puisque l'information circule sous une forme standardisée au lieu d'être ajustée au besoin |
| Système en couches | savoir si l'interlocuteur est le serveur ou un intermédiaire | proxies, caches et pare-feu s'intercalent sans rien casser |
| Code à la demande (facultative) | rien d'obligatoire, mais elle coûte de la visibilité : un intermédiaire ne sait plus ce que le client fera du code reçu. C'est pour cela qu'elle reste facultative | le serveur étend le client après coup, par exemple avec le JavaScript d'une page |
Ces contraintes ont des contreparties. Une requête indépendante doit transporter le contexte nécessaire à son traitement. Le cache nécessite des indications permettant de savoir si une réponse peut être réutilisée. Une interface commune peut être moins optimisée qu'un échange taillé pour un seul client.
La contrainte « sans état » ne signifie pas que le serveur oublie les commandes ou les comptes qu'il stocke. Elle concerne l'état de session nécessaire pour comprendre la demande : le serveur doit pouvoir traiter la requête à partir de ce qu'elle fournit.
Le navigateur y est un client générique : il dialogue avec des milliards de serveurs qu'il n'a jamais rencontrés, sans être recompilé pour aucun. C'est possible parce que chaque réponse lui indique ce qu'il peut faire ensuite : les liens à suivre, les formulaires à soumettre.
Le client d'une « API REST » ordinaire, lui, doit connaître l'application à l'avance et écrire les URL en dur dans son code.
L'hypermédia désigne ici les liens et les formulaires présents dans les réponses. Le navigateur sait afficher une page et soumettre un formulaire ; l'utilisateur choisit l'action qui correspond à son objectif. Le serveur fournit les destinations et les contrôles disponibles.
Cette organisation réduit la dépendance aux chemins d'URL connus à l'avance. Elle ne supprime pas tous les contrats : le client doit comprendre le format des messages et le sens des relations qu'il utilise.
Je commencerais la lecture d'une API par une réponse réelle : indique-t-elle ses règles de cache, ses liens et les actions disponibles ? L'article sur l'interface uniforme et l'hypermédia montre comment ces informations guident un client.
Le sens du mot s'est rétréci à mesure qu'il se répandait. L'expression circule dès 2002-2003 : Amazon appelle déjà « REST » l'interface en paramètres d'URL qu'il offre à côté de SOAP, et Tim O'Reilly rapporte alors que 85 % de l'usage passe par elle. Mais c'est à partir de 2007 qu'elle devient le mot par défaut, et une vulgarisation qui ne retient que les ressources et les verbes.
| Date | Ce qui se passe |
|---|---|
| 1990 | Tim Berners-Lee met en service au CERN le premier serveur web (nxoc01.cern.ch, plus tard info.cern.ch) et un HTTP minimal qui n'a qu'une commande : GET. |
| 1991 | Le Web sort de l'équipe : diffusion générale sur les machines centrales du CERN en mai, annonce publique sur alt.hypertext le 6 août. Ce HTTP minimal restera connu sous le nom d'HTTP/0.9. |
| 1994-1995 | Fielding élabore la première version du style, d'abord comme un moyen de communiquer les concepts du Web pendant l'écriture d'HTTP/1.0. |
| 1996 | HTTP/1.0 (RFC 1945) met par écrit l'usage courant : un sous-ensemble interopérable de ce qui tourne déjà. Le document prévient lui-même qu'il « ne spécifie aucun standard Internet ». |
| 1997 et 1999 | HTTP/1.1 est formalisé (RFC 2068), puis révisé (RFC 2616), avec Fielding comme premier auteur listé. Cache, absence d'état et interface uniforme deviennent des règles écrites. |
| 2000 | La thèse publie et nomme le style. Le modèle, lui, a déjà cinq ans et a servi à écrire les protocoles qu'il décrit. |
| Première moitié des années 2000 | REST sert surtout d'argument contre les « services web » lourds (SOAP, la pile WS-*), du RPC empaqueté dans du XML. Il propose une alternative simple : des ressources, des URL et les verbes HTTP. |
| 2007 | Le livre RESTful Web Services (Richardson et Ruby, O'Reilly) en donne la première synthèse. Ruby on Rails 1.2 met les routes « RESTful » au cœur d'un framework massivement adopté. Java lance la spécification JAX-RS. L'expression « API REST » s'installe, et le sens glisse. |
| 2008 | Fielding publie une mise au point restée célèbre, REST APIs must be hypertext-driven, pour rappeler ce que la mode oubliait déjà. En novembre, Leonard Richardson expose à QCon une « heuristique de maturité » qui décompose les éléments d'une approche REST. |
| 2010 | Martin Fowler la nomme « modèle de maturité de Richardson » et la fait connaître. Elle aide à comprendre les briques de REST ; elle ne gradue pas le respect du style, et Fowler y insiste : le niveau 3 est une condition d'entrée, pas un sommet. |
| Années 2010 | L'« API REST » devient le contrat par défaut des back-ends web et mobiles : Spring, JAX-RS, Django REST framework (2011), ASP.NET Web API (2012). JSON remplace XML. L'hypermédia, la contrainte la plus exigeante, reste presque partout de côté. |
| 2015 | GraphQL et gRPC apparaissent. Leur essor s'explique en partie par ce vide. |
| Années 2020 | L'hypermédia revient par le HTML : le mouvement htmx, le livre Hypermedia Systems en 2023. |
Explorer
Choisis dans l’index d’après les étiquettes de cet article — les plus proches d’abord, hors de sa série. Rien n’est écrit à la main : un article publié demain avec les mêmes étiquettes y prendra place.
Une réponse perdue ne signifie pas que l’opération a échoué. Méthodes HTTP, clés d’idempotence et suivi du résultat aident à réessayer sans créer de doublon.
GET sert souvent les vues de lecture, tandis que les écritures demandent une décision métier. REST et CQRS se combinent sans imposer le même découpage.
Une dépendance ne répond plus : servir une copie, attendre ou refuser dépend de l’opération. Les réponses HTTP doivent rendre ce choix clair pour le client.
Laisser un commentaire
Votre commentaire sera relu avant d'être publié.