REST est un style d’API aux endpoints fixes ; GraphQL est un langage de requêtes où le client demande à un seul endpoint les seuls champs dont il a besoin. La comparaison porte en réalité sur qui décide de la forme de la réponse : en REST, le serveur l’a décidée à la conception ; en GraphQL, le client la décide à chaque requête. Tout le reste — cache, versionnage, erreurs, performance — découle de cette seule inversion.
Points clés
| Question | Réponse |
|---|---|
| REST | De nombreux endpoints, des réponses définies par le serveur, un cache natif HTTP |
| GraphQL | Un endpoint, un schéma typé, des champs et une imbrication choisis par le client |
| La victoire de GraphQL | Overfetching et underfetching meurent ; un aller-retour par écran |
| La victoire de REST | Cache CDN, simplicité, support universel |
| La réalité de 2026 | Coexistence — REST partout, GraphQL comme couche d’agrégation du frontend |
Le même écran, des deux façons
Un écran de profil a besoin d’un utilisateur, de ses cinq derniers posts et de son nombre d’abonnés. REST parle en ressources :
GET /users/42 → 38 champs, il vous en fallait 3 (overfetching)
GET /users/42/posts?limit=5 → deuxième aller-retour (underfetching)
GET /users/42/followers → troisième aller-retour
GraphQL parle en une seule question façonnée :
POST /graphql
query {
user(id: 42) {
name
avatarUrl
posts(first: 5) { title likes }
followers { totalCount }
}
}
→ un seul aller-retour, exactement ces champs, rien d'autre
L’écart se resserre plus que les gros titres ne le suggèrent : un REST bien conçu supporte aussi la sélection de champs — et les query builders des SDK en font une habitude de premier ordre :
// JavaScript / Node.js — Back4app JS SDK
// GraphQL's best trick — ask only for what you need — without leaving REST
const query = new Parse.Query('Article');
query.equalTo('status', 'published');
query.select('title', 'views'); // field selection, GraphQL-style
const articles = await query.find(); // lean payload over the REST API
// The same backend also speaks real GraphQL: query { articles { ... } } // Flutter / Dart — Back4app Flutter SDK
// GraphQL's best trick — ask only for what you need — without leaving REST
final query = QueryBuilder<ParseObject>(ParseObject('Article'))
..whereEqualTo('status', 'published')
..keysToReturn(['title', 'views']); // field selection, GraphQL-style
final response = await query.query(); // lean payload over the REST API // iOS / Swift — Back4app Swift SDK
// GraphQL's best trick — ask only for what you need — without leaving REST
let query = Article.query("status" == "published")
.select("title", "views") // field selection, GraphQL-style
query.find { result in
if case .success(let articles) = result { render(articles) }
} // Android / Kotlin — Back4app Android SDK
// GraphQL's best trick — ask only for what you need — without leaving REST
val query = ParseQuery.getQuery<ParseObject>("Article")
query.whereEqualTo("status", "published")
query.selectKeys(listOf("title", "views")) // field selection, GraphQL-style
query.findInBackground { articles, e -> if (e == null) render(articles) } GraphQL vs. REST en un coup d’œil
| Dimension | REST | GraphQL |
|---|---|---|
| Endpoints | Nombreux, en forme de ressources | Un seul, en forme de schéma |
| Forme de la réponse | Définie par le serveur | Choisie par le client à chaque requête |
| Typage | Convention (OpenAPI optionnel) | Imposé par le schéma, introspectable |
| Allers-retours | Un par ressource | Un par écran |
| Cache | Natif HTTP/CDN, indexé par URL | Normalisé côté client ; persisted queries |
| Versionnage | /v1 → /v2 | Évoluer + déprécier, sans versions |
| Erreurs | Codes de statut HTTP | 200 + tableau errors, résultats partiels |
| Temps réel | À part (webhooks, sockets) | Subscriptions dans la spec |
| Courbe d’apprentissage | Minimale | Schéma, resolvers, contrôle des coûts |
| Meilleur premier choix | CRUD public, cacheable, simple | Frontends multi-clients, denses en données |
Ce que les pages de comparaison passent sous silence
Le problème N+1 a déménagé, il n’est pas mort. Une requête GraphQL pour des posts-avec-auteurs déclenche naïvement un appel de resolver par post — la même pathologie N+1 que les ORM ont rendue célèbre, désormais côté serveur. Le remède standard est le batching : un loader par requête collecte les identifiants d’auteurs et les récupère en une seule requête. Adopter GraphQL sans stratégie de batching, c’est adopter le pire bug de performance de REST à une nouvelle adresse.
Les erreurs sont une décision d’exploitation. « 200 avec un tableau errors » signifie que les dashboards, les alertes et la logique CDN construits sur les codes de statut deviennent aveugles par défaut. Les équipes qui prospèrent avec GraphQL traitent l’observabilité des erreurs comme une partie de l’adoption, pas comme une réflexion après coup.
Les requêtes sans bornes ont besoin de bornes. Un endpoint flexible signifie qu’une seule requête peut traverser tout le graphe — les recommandations officielles de sécurité sont des limites de profondeur, des budgets de coût par requête et des listes d’autorisation de persisted queries pour les clients first-party. Les endpoints fixes de REST rendaient le contrôle des coûts implicite ; GraphQL en fait votre travail.
Cas d’usage courants
- GraphQL : apps mobiles sur réseaux lents, dashboards qui assemblent de nombreuses entités, produits avec des clients web + mobile + partenaires aux besoins de données divergents, itération rapide du frontend contre un schéma stable.
- REST : API publiques pour développeurs, diffusion de contenu cacheable, surfaces de webhooks et d’intégration, transfert de fichiers, appels service-à-service où la simplicité l’emporte.
- Les deux (la norme enterprise) : REST ou RPC entre services backend ; une couche GraphQL qui les agrège pour les frontends — le pattern backend-for-frontend avec un schéma.
Devriez-vous choisir GraphQL ou REST ? Matrice de décision
| Choisissez REST quand… | Choisissez GraphQL quand… | Utilisez les deux quand… |
|---|---|---|
| Des tiers consomment l’API | Les écrans assemblent de nombreuses ressources | Les services parlent REST, les frontends veulent des formes |
| Le cache CDN porte la charge | Les clients diffèrent dans leurs besoins de données | Une API publique et un frontend produit coexistent |
| Les ressources mappent 1:1 sur les écrans | L’overfetching fait souffrir les utilisateurs mobiles | Vous migrez de façon incrémentale |
| L’équipe livre cette semaine | Les contrats typés accélèrent le travail frontend | Des équipes différentes possèdent des couches différentes |
| Fichiers et webhooks dominent | Les subscriptions temps réel sont au cœur | Vous préférez ne pas rouvrir ce débat |
Le point de départ honnête : commencez en REST, ajoutez GraphQL quand la douleur du façonnage de données multi-clients arrive vraiment — et si votre plateforme génère les deux depuis un seul schéma, le choix cesse d’être architectural et devient par requête.
Limites et trade-offs
- REST : over/underfetching sur les écrans denses en données, migrations de versions, dérive de la forme des réponses entre équipes, et N endpoints de documentation.
- GraphQL : le cache exige de la machinerie, le contrôle des coûts exige de la vigilance, les resolvers exigent une discipline de batching, et le pattern 200-avec-errors exige de refaire l’observabilité.
- Les deux : aucun ne répare un mauvais modèle de données — un domaine confus produit une API confuse dans n’importe quel style, comme la thèse de REST elle-même le laisse discrètement entendre : les contraintes ont toujours porté sur l’architecture en dessous.
GraphQL et 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. Il dissout le dilemme de cet article à la racine : les deux styles d’API sont générés depuis le même schéma — des endpoints REST cacheables par URL et une API GraphQL typée avec requêtes imbriquées — plus des SDK dont la sélection de champs (les onglets de code ci-dessus) livre le bénéfice phare de GraphQL sur l’un ou l’autre transport. Choisissez par client, changez par écran, et n’écrivez jamais la couche d’API.
Questions fréquentes
Quelle est la principale différence entre GraphQL et REST ?
La forme du contrat. REST expose de nombreux endpoints de ressources, chacun renvoyant une réponse définie par le serveur — vous prenez ce que l'endpoint vous donne. GraphQL expose un seul endpoint avec un schéma typé, et chaque client écrit une requête nommant exactement les champs et les relations imbriquées qu'il veut. REST fige les réponses côté serveur ; GraphQL déplace cette décision vers le client.
GraphQL est-il plus rapide que REST ?
Pour les écrans qui ont besoin de données issues de plusieurs ressources, généralement oui — une requête remplace plusieurs allers-retours et le payload ne porte que les champs demandés. Pour une ressource simple, REST est souvent plus rapide parce que ses réponses indexées par URL se mettent en cache à merveille sur les CDN. Et des resolvers mal écrits peuvent rendre GraphQL plus lent que tout, via le problème N+1. La charge de travail décide.
Que sont l'overfetching et l'underfetching ?
Les deux douleurs de REST que GraphQL a été conçu pour résoudre. Overfetching : un endpoint renvoie la ressource entière quand l'écran a besoin de trois champs. Underfetching : un appel ne suffit pas, donc le client enchaîne N requêtes de suivi pour les données liées. La sélection de champs et les requêtes imbriquées traitent les deux — c'est pourquoi les apps multi-clients et denses en données ressentent les premières l'attraction vers GraphQL.
GraphQL est-il en train de remplacer REST ?
Non — les données du secteur indiquent une coexistence. Les enquêtes montrent invariablement l'écrasante majorité des équipes sur REST, avec environ un tiers utilisant GraphQL, le plus souvent à côté de REST plutôt qu'à sa place. Le pattern enterprise dominant est hybride : REST (ou RPC) entre services et pour les API publiques, avec GraphQL comme couche d'agrégation servant les clients frontend.
En quoi le cache diffère-t-il entre REST et GraphQL ?
Les réponses REST vivent à des URL uniques, donc navigateurs et CDN les mettent en cache sans le moindre effort — son superpouvoir discret. GraphQL envoie typiquement des POST vers un seul endpoint, ce qui casse le cache indexé par URL ; l'écosystème compense avec des caches normalisés côté client et des persisted queries sur GET. Le cache est l'argument le plus fort en faveur de REST sur les API publiques à forte lecture.
En quoi le versionnage diffère-t-il ?
REST versionne explicitement — un v2 dans l'URL ou un header — et fait tourner les deux versions pendant les migrations. GraphQL vise l'évolution sans versions : ajoutez librement des champs, marquez les anciens comme deprecated, observez la télémétrie d'usage et retirez-les quand les clients cessent de les demander. Les deux fonctionnent ; GraphQL échange la cérémonie des versions contre une discipline de gouvernance du schéma.
En quoi les erreurs diffèrent-elles entre les deux ?
REST s'appuie sur les codes de statut HTTP — un 404 est visible pour chaque proxy, moniteur et bibliothèque cliente. GraphQL renvoie généralement un 200 avec un tableau errors à côté de données partielles, ce qui permet le succès partiel mais oblige le monitoring à parser les corps de réponse plutôt qu'à faire confiance aux codes de statut. C'est une vraie différence opérationnelle, pas une note de bas de page.
Quand devriez-vous encore choisir REST ?
Des déclencheurs concrets : des API publiques consommées par de nombreux tiers, du trafic de lecture très cacheable, du CRUD simple en forme de ressources, des uploads et downloads de fichiers, des intégrations façon webhook, et des équipes sans expérience opérationnelle de GraphQL. REST est le choix par défaut que tout supporte ; GraphQL est le spécialiste que vous embauchez pour des frontends multi-clients et denses en données.