Une API REST est une API qui suit le style architectural REST : ressources à des URL, requêtes sans état et méthodes HTTP standard. REST — Representational State Transfer, défini dans la thèse de doctorat de Roy Fielding en 2000 — est un style, pas un protocole ni un standard : un ensemble de contraintes qui, honorées ensemble, produisent des API que tout le web sait déjà consommer, mettre en cache et mettre à l’échelle.
Points clés
| Question | Réponse |
|---|---|
| Le modèle | Ressources à des URL · représentations (généralement JSON) · méthodes standard |
| La source | La thèse de Fielding de 2000, chapitre 5 — un style architectural, pas une spec |
| Les six contraintes | Client-serveur · sans état · cacheable · interface uniforme · en couches · code à la demande (optionnel) |
| Les verbes | GET · POST · PUT · PATCH · DELETE — avec leur sémantique de sûreté et d’idempotence |
| La note honnête | La plupart des API « REST » de production sont des API HTTP de niveau 2 — et c’est très bien |
Un cycle CRUD complet en HTTP brut
Tout le style en quatre requêtes — voilà ce que chaque framework et SDK finit par envoyer :
POST /v1/posts → 201 Created créer
{ "title": "Hello REST" } Location: /v1/posts/8fk2
GET /v1/posts/8fk2 → 200 OK lire
{ "title": "Hello REST", … }
PUT /v1/posts/8fk2 → 200 OK remplacer
{ "title": "Hello again" } (PATCH mettrait à jour des champs)
DELETE /v1/posts/8fk2 → 204 No Content supprimer
GET /v1/posts/8fk2 → 404 Not Found …et il a disparu
Le même cycle à travers les SDK qui enveloppent les appels REST :
// JavaScript / Node.js — Back4app JS SDK
// The REST semantics, wrapped: create, read, update, delete
const post = new Parse.Object('Post');
post.set('title', 'Hello REST');
await post.save(); // POST /classes/Post → 201
const fetched = await new Parse.Query('Post')
.get(post.id); // GET /classes/Post/:id → 200
fetched.set('title', 'Hello again');
await fetched.save(); // PUT /classes/Post/:id → 200
await fetched.destroy(); // DELETE /classes/Post/:id → 200 // Flutter / Dart — Back4app Flutter SDK
// The REST semantics, wrapped: create, read, update, delete
final post = ParseObject('Post')..set('title', 'Hello REST');
await post.save(); // POST /classes/Post → 201
await post.fetch(); // GET /classes/Post/:id → 200
post.set('title', 'Hello again');
await post.save(); // PUT /classes/Post/:id → 200
await post.delete(); // DELETE /classes/Post/:id → 200 // iOS / Swift — Back4app Swift SDK
// The REST semantics, wrapped: create, read, update, delete
var post = Post()
post.title = "Hello REST"
let saved = try await post.save() // POST /classes/Post → 201
let fetched = try await saved.fetch() // GET /classes/Post/:id → 200
var updated = fetched
updated.title = "Hello again"
_ = try await updated.save() // PUT /classes/Post/:id → 200
try await updated.delete() // DELETE /classes/Post/:id → 200 // Android / Kotlin — Back4app Android SDK
// The REST semantics, wrapped: create, read, update, delete
val post = ParseObject("Post")
post.put("title", "Hello REST")
post.save() // POST /classes/Post → 201
val fetched = ParseQuery.getQuery<ParseObject>("Post")
.get(post.objectId) // GET /classes/Post/:id → 200
fetched.put("title", "Hello again")
fetched.save() // PUT /classes/Post/:id → 200
fetched.delete() // DELETE /classes/Post/:id → 200 Les six contraintes de REST
- Client-serveur — interface et implémentation évoluent indépendamment ; l’UI ne sait jamais comment fonctionne le stockage.
- Sans état — chaque requête est autonome ; le serveur ne garde aucune session entre les appels, ce qui permet à n’importe quelle réplique de répondre à n’importe quelle requête.
- Cacheable — les réponses déclarent leur propre cacheabilité ; des GET avec de bons headers de cache mettent toute l’infrastructure de cache du web (navigateurs, CDN, proxys) au travail pour votre API.
- Interface uniforme — la contrainte qui est REST, en quatre parties : ressources identifiées par des URI ; manipulation via des représentations (vous renvoyez le JSON que la ressource doit devenir) ; messages autodescriptifs (méthode + headers disent tout ce qu’il faut pour traiter la requête) ; et hypermédia comme moteur de l’état de l’application (les réponses lient les actions suivantes).
- Système en couches — les clients ne peuvent pas savoir s’ils parlent à l’origine, à un cache ou à une gateway ; les intermédiaires s’insèrent librement.
- Code à la demande (optionnel) — les serveurs peuvent envoyer du code exécutable aux clients ; la seule contrainte marquée optionnelle, et celle que la plupart des API ignorent.
Méthodes HTTP : sûreté, idempotence, CRUD
Le tableau qui manque à presque toutes les pages bien classées — la sémantique du RFC 9110, condensée :
| Méthode | Rôle CRUD | Sûre ? | Idempotente ? | Réessayer à l’aveugle ? |
|---|---|---|---|---|
| GET | Lire | Oui | Oui | Oui |
| POST | Créer | Non | Non | Non — peut dupliquer |
| PUT | Remplacer | Non | Oui | Oui — même résultat |
| PATCH | Mise à jour partielle | Non | Non garanti | Dépend du design du patch |
| DELETE | Supprimer | Non | Oui | Oui — toujours supprimé |
Sûre signifie que la requête ne change rien ; idempotente, que la répéter ne change rien de plus. Ce n’est pas de la culture générale — c’est la politique de retry : un timeout réseau sur un PUT se réessaie sans crainte, le même timeout sur un POST exige une clé d’idempotence ou un contrôle de doublons. Le mapping CRUD complet a sa propre entrée.
Codes de statut : quoi renvoyer, et quand
| Situation | Renvoyez |
|---|---|
| Lecture réussie | 200 OK |
| Ressource créée | 201 Created + header Location |
| Supprimé ; rien à dire | 204 No Content |
| Requête malformée | 400 Bad Request |
| Identifiants absents ou invalides | 401 Unauthorized |
| Authentifié mais non autorisé | 403 Forbidden |
| Ressource inexistante | 404 Not Found |
| Rate limit dépassé | 429 Too Many Requests (détails) |
| Panne du serveur | 500 Internal Server Error |
Les distinctions 401/403 et 200/201/204 sont là où l’artisanat d’une API se voit : des codes précis rendent les clients débogables avec rien d’autre que la ligne de statut.
Votre API est-elle vraiment REST ? L’échelle de maturité
La section honnête que les explications commerciales omettent. Le Richardson Maturity Model note les API HTTP : niveau 0 (une URL, un verbe, du RPC déguisé), niveau 1 (des ressources à des URL), niveau 2 (méthodes et codes de statut corrects), niveau 3 (hypermédia — HATEOAS).
Sur l’insistance de Fielding lui-même, une API sans hypermédia n’est pas REST — il a écrit un essai acéré disant exactement cela. En pratique, presque chaque « API REST » acclamée est une API HTTP de niveau 2 : ressources, verbes, codes de statut, JSON, pas d’hypermédia. Cela compte moins comme pureté que comme vocabulaire — connaître l’échelle vous dit ce que le terme signifie dans une offre d’emploi (niveau 2) versus dans la thèse (niveau 3), et vous épargne à la fois le HATEOAS de cargo cult et les corrections pédantes.
REST vs. SOAP vs. GraphQL vs. gRPC
| REST | SOAP | GraphQL | gRPC | |
|---|---|---|---|---|
| Nature | Style architectural | Protocole | Langage de requêtes + runtime | Framework RPC |
| Sur le fil | JSON sur HTTP | Enveloppes XML | JSON sur HTTP (un endpoint) | Protobuf sur HTTP/2 |
| Contrat | OpenAPI (convention) | WSDL (obligatoire) | Schéma (intégré) | .proto (obligatoire) |
| Cache | Natif HTTP — son superpouvoir | Pauvre | Au niveau applicatif | Au niveau applicatif |
| Point fort | CRUD public de ressources | Formalisme enterprise/legacy | Données imbriquées façonnées par le client | Vitesse entre services internes |
| Faiblesse | Formes fixes sujettes à l’over/underfetching | Verbosité | Complexité du cache et des rate limits | Friction navigateur |
La comparaison avec GraphQL a droit à une entrée complète.
Les conventions qui rendent une API REST agréable
Au-delà des contraintes, les conventions sur lesquelles les consommateurs vous notent en silence : des ressources au pluriel (/posts, pas /getPost) ; une imbrication d’un niveau maximum (/posts/8fk2/comments, puis stop) ; la pagination sur chaque collection — par curseur pour la profondeur et la stabilité, avec des limites appliquées ; le filtrage et le tri en paramètres de requête, pas en variantes d’endpoint ; le versionnage avec une politique explicite (chemin /v1/ ou header — choisissez-en un, publiez des fenêtres de dépréciation) ; la négociation de contenu respectée (Accept, Content-Type) ; et des erreurs en JSON structuré avec un code lisible par les machines, pas seulement de la prose. Rien de tout cela n’est dans la thèse ; tout est dans la différence entre une API que les développeurs recommandent et une qu’ils subissent.
Cas d’usage courants
- API publiques et partenaires — l’ubiquité de REST est la fonctionnalité : chaque langage, outil et développeur le parle.
- Backends d’apps mobiles et web — le CRUD de ressources sur HTTP correspond à la façon dont la plupart des écrans consomment réellement les données.
- Frontières entre microservices — des contrats internes où l’outillage HTTP (gateways, tracing, cache) gagne sa place.
- Intégrations façon webhook — des systèmes qui notifient des systèmes par de simples appels HTTP que les deux côtés comprennent déjà.
- API de données générées automatiquement — les plateformes qui exposent une base de données comme ressources REST — le chemin le plus rapide du schéma à une API qui fonctionne.
Devriez-vous utiliser REST ? Matrice de décision
| REST est le bon défaut quand… | Cherchez autre chose quand… |
|---|---|
| API publique, consommateurs inconnus | Maillage interne à haut débit → gRPC |
| Domaine CRUD en forme de ressources | Les clients doivent façonner des réponses imbriquées → GraphQL |
| Le cache HTTP peut porter la charge de lecture | Push bidirectionnel temps réel → WebSockets / live queries |
| La simplicité et l’étendue de l’outillage comptent | Contrats enterprise formels exigés → SOAP |
| Les écrans mappent proprement sur des ressources | Un écran agrège cinq services → endpoint composite / BFF |
Limites et trade-offs
- Les représentations fixes ne vont pas à des clients divers. Le duo overfetching/underfetching est la faiblesse structurelle de REST ; les sparse fieldsets et les paramètres d’expansion atténuent, GraphQL redessine.
- Aucun contrat obligatoire. Rien n’impose une spec OpenAPI, donc beaucoup d’API REST sont documentées par folklore ; la discipline est optionnelle là où gRPC et GraphQL la rendent structurelle.
- L’absence d’état répète le contexte. L’auth et le contexte de tenant voyagent dans chaque requête — bon marché en octets, mais cela pousse la sémantique de session vers les tokens et rend certains flux (transactions en plusieurs étapes) inconfortables.
- La tentation du N+1 par design. Penser ressource-par-URL invite aux clients à un-appel-par-élément ; les bonnes API livrent expansion et batch avant que les consommateurs n’improvisent des boucles.
- Le mot « REST » est ambigu. API HTTP de niveau 2 dans la plupart des bouches, architecture hypermédia dans la thèse — lisez laquelle des deux une spec, une offre d’emploi ou un relecteur veut dire avant de débattre.
Les API REST sur Back4app
Back4app est une plateforme open-source de Backend as a Service (BaaS) qui combine une base de données gérée, des API REST et GraphQL générées automatiquement, l’authentification, le stockage de fichiers et des fonctions serverless avec Cloud Code. L’API REST ici est générée, pas construite : chaque classe de votre modèle de données est immédiatement une ressource — POST /classes/Post crée, GET /classes/Post/:id lit, avec les méthodes, les codes de statut et la sémantique de Location du parcours ci-dessus — derrière des clés, des tokens d’utilisateur et des permissions au niveau des classes qui font respecter la frontière. Les onglets de code montrent le même cycle à travers les SDK, qui sont de minces enveloppes idiomatiques sur exactement ce HTTP ; quand une opération dépasse le CRUD, une fonction Cloud Code ajoute un endpoint sur mesure dans un fichier. Du REST de niveau 2, correct par défaut, du schéma à l’URL le temps de définir la classe.
Questions fréquentes
Qu'est-ce qu'une API REST en termes simples ?
Une façon pour deux applications de se parler sur HTTP avec des conventions que tout le monde connaît déjà : chaque chose (un utilisateur, une commande) vit à une URL, vous agissez dessus avec un verbe standard — GET pour lire, POST pour créer, PUT ou PATCH pour mettre à jour, DELETE pour supprimer — et chaque requête se suffit à elle-même, portant tout ce dont le serveur a besoin pour y répondre.
Que signifie REST ?
Representational State Transfer — transfert d'état représentationnel — issu de la thèse de doctorat de Roy Fielding en 2000. Le nom décrit le mécanisme : le serveur transfère au client une représentation de l'état d'une ressource (généralement du JSON), et le client fait passer l'application d'état en état à travers ces représentations.
Quelle est la différence entre REST et RESTful ?
Dans l'usage courant, aucune — les termes sont interchangeables. Pour être pédant, REST nomme le style architectural et RESTful est l'adjectif pour une API qui l'implémente. L'affirmation qui circule selon laquelle « RESTful suit toutes les règles et REST seulement certaines » n'a aucun fondement dans le travail de Fielding.
Quelles sont les six contraintes de REST ?
Séparation client-serveur, absence d'état, cacheabilité, interface uniforme, système en couches et — en option — code à la demande. L'interface uniforme se décompose elle-même en quatre règles : ressources identifiées par des URI, manipulation via des représentations, messages autodescriptifs et hypermédia comme moteur de l'état de l'application.
Quelle est la différence entre PUT et POST ?
Idempotence et adressage. POST crée sous une collection — le serveur assigne l'URL, et répéter la requête crée des doublons. PUT écrit une représentation complète à une URL connue — le répéter produit le même état, ce qui rend les retries sûrs. Cette différence de sûreté, pas le style, est la raison pour laquelle la distinction compte.
Une API REST doit-elle utiliser JSON ?
Non. REST est agnostique au format — une ressource peut être représentée en JSON, XML, HTML ou comme une image, négociée via les headers Accept et Content-Type. JSON est simplement le choix par défaut moderne parce que chaque client le parse à bas coût. La contrainte porte sur les représentations, pas sur l'une en particulier.
Que signifie sans état (stateless) dans une API REST ?
Le serveur ne garde aucune mémoire du client entre les requêtes : chaque requête porte tout ce qu'il faut pour la traiter, y compris les identifiants comme un bearer token. Le gain, c'est la mise à l'échelle horizontale — n'importe quel serveur peut répondre à n'importe quelle requête — et le coût, quelques octets de contexte répétés à chaque appel.
Qu'est-ce que HATEOAS ?
Hypermedia As The Engine Of Application State : les réponses incluent des liens vers les actions disponibles ensuite, de sorte que les clients naviguent dans l'API comme les gens naviguent sur le web — en suivant des liens plutôt qu'en codant les URL en dur. C'est la contrainte la moins implémentée ; la plupart des API « REST » de production la sautent et vivent heureuses au niveau 2 du modèle de maturité.