Nehos Groupe
Définition & Concepts

GraphQL vs REST

Version Décideur

L'essentiel

Imaginez un restaurant. Avec REST, la carte propose des plats fixes : vous commandez le 'plat 3', vous recevez exactement ce qui est décrit sur la carte, même si vous n'aimez pas la garniture. Vous voulez le plat principal et le dessert ? Deux commandes séparées. C'est REST : un endpoint, une ressource, une réponse fixe. Avec GraphQL, c'est un buffet sur mesure : vous dites exactement ce que vous voulez ('je prends le poulet, les haricots verts, et la crème brûlée, pas la sauce'). Une seule requête, vous recevez exactement ce que vous avez demandé, sans surplus. Pour une app mobile avec une connexion limitée, c'est un gain réel : au lieu de recevoir 50 champs, vous n'en recevez que les 8 utiles. Le piège GraphQL ? Il faut que le cuisinier soit organisé (le DataLoader), sinon pour chaque plat commandé il court 20 fois à la cave chercher des ingrédients un par un (c'est le problème N+1). Et le cache du restaurant (le cache HTTP) ne fonctionne plus — chaque commande est unique, impossible de préparer en avance.

Version Expert

Détails Techniques

REST (Representational State Transfer) est un style d'architecture API défini par Roy Fielding en 2000. Il repose sur des endpoints URL fixes représentant des ressources, des verbes HTTP (GET, POST, PUT, PATCH, DELETE), et des réponses JSON ou XML statiques. Chaque endpoint retourne une forme fixe de données — sous-fetching si le client a besoin de plus, over-fetching s'il en reçoit trop. Le versioning (v1, v2) est nécessaire pour faire évoluer le contrat API sans casser les clients existants. Avantage majeur : le cache HTTP natif (CDN, browser, proxy) fonctionne nativement sur les requêtes GET. GraphQL est un langage de requête et un runtime d'exécution créé par Facebook en 2012, rendu open source en 2015, maintenu par la GraphQL Foundation. Architecture : un endpoint unique (souvent /graphql), un schéma de types fort défini en SDL (Schema Definition Language), des opérations de type Query (lecture), Mutation (écriture) et Subscription (temps réel via WebSocket). Le client décrit précisément les champs désirés dans sa requête — le serveur retourne exactement cette forme, sans surplus. Introspection native : les clients peuvent interroger le schéma pour en connaître les types et les champs. Tooling riche : GraphiQL (IDE en ligne), Apollo Studio, GraphQL Code Generator. Point de vigilance N+1 : une requête fetchant N objets et pour chacun leurs sous-ressources génère N+1 requêtes SQL si le DataLoader (batching) n'est pas implémenté.

#Définition GraphQL vs REST

REST (Representational State Transfer) est un style d'architecture API défini par Roy Fielding en 2000. Il repose sur des endpoints URL fixes représentant des ressources, des verbes HTTP (GET, POST, PUT, PATCH, DELETE), et des réponses JSON ou XML statiques. Pour approfondir, consultez la page service Development Next.js Nehos.

D'un point de vue métier, Chaque endpoint retourne une forme fixe de données — sous-fetching si le client a besoin de plus, over-fetching s'il en reçoit trop. Le versioning (v1, v2) est nécessaire pour faire évoluer le contrat API sans casser les clients existants. Avantage majeur : le cache HTTP natif (CDN, browser, proxy) fonctionne nativement sur les requêtes GET. GraphQL est un langage de requête et un runtime d'exécution créé par Facebook en 2012, rendu open source en 2015, maintenu par la GraphQL Foundation. Architecture : un endpoint unique (souvent /graphql), un schéma de types fort défini en SDL (Schema Definition Language), des opérations de type Query (lecture), Mutation (écriture) et Subscription (temps réel via WebSocket). Le client décrit précisément les champs désirés dans sa requête — le serveur retourne exactement cette forme, sans surplus. Introspection native : les clients peuvent interroger le schéma pour en connaître les types et les champs. Tooling riche : GraphiQL (IDE en ligne), Apollo Studio, GraphQL Code Generator. Point de vigilance N+1 : une requête fetchant N objets et pour chacun leurs sous-ressources génère N+1 requêtes SQL si le DataLoader (batching) n'est pas implémenté.

Le concept de GraphQL vs REST prend tout son sens dans un contexte B2B où chaque décision technique impacte directement le ROI.

#GraphQL vs REST expliqué simplement

Imaginez un restaurant. Avec REST, la carte propose des plats fixes : vous commandez le 'plat 3', vous recevez exactement ce qui est décrit sur la carte, même si vous n'aimez pas la garniture. Vous voulez le plat principal et le dessert ? Deux commandes séparées. C'est REST : un endpoint, une ressource, une réponse fixe.

Avec GraphQL, c'est un buffet sur mesure : vous dites exactement ce que vous voulez ('je prends le poulet, les haricots verts, et la crème brûlée, pas la sauce'). Une seule requête, vous recevez exactement ce que vous avez demandé, sans surplus. Pour une app mobile avec une connexion limitée, c'est un gain réel : au lieu de recevoir 50 champs, vous n'en recevez que les 8 utiles.

Le piège GraphQL ? Il faut que le cuisinier soit organisé (le DataLoader), sinon pour chaque plat commandé il court 20 fois à la cave chercher des ingrédients un par un (c'est le problème N+1). Et le cache du restaurant (le cache HTTP) ne fonctionne plus — chaque commande est unique, impossible de préparer en avance.

Situation classique dans les projets que Nehos accompagne. Ce scénario, on le voit sur 3 projets sur 5 en phase de cadrage.

#Cas d'usage concrets

BFF (Backend For Frontend) — app mobile + web admin avec données imbriquées — Plateforme SaaS B2B Nehos : frontend Next.js web consomme des données larges (dashboards), app mobile React Native consomme des données légères (synthèse). Un seul backend GraphQL avec deux requêtes distinctes. Payload mobile réduit de 38 % vs l'ancien REST avec réponses fixes. Temps de développement frontend divisé par 1,8 sur les nouveaux écrans.

API publique stable — microservices simples — API REST Payload CMS exposant des collections Content, Media, Users via endpoints standardisés. Simple, documentée automatiquement, cacheable sur CDN (Cloudflare). Pas besoin de GraphQL : les données sont simples, un seul type de client (frontend Next.js), les réponses fixes suffisent. Maintenable par une équipe junior sans formation GraphQL.

Architecture multi-clients omnicanal (web + mobile + TV + kiosques) — Retailer omnicanal : site web Next.js, app iOS/Android, bornes kiosques en magasin et intégration TV connectée consomment le même backend catalogue. GraphQL permet à chaque client de demander la forme de données adaptée à son contexte. Évite de créer 4 endpoints REST différents ou de renvoyer des réponses surdimensionnées sur les bornes kiosques.

#GraphQL vs REST chez Nehos Groupe

L'équipe Nehos travaille avec cette technologie depuis ses débuts. Sur les 3 derniers projets impliquant GraphQL vs REST, on a documenté les résultats avec des KPIs précis. Notre service Development Next.js Nehos couvre ce périmètre de A à Z.

La méthode Nehos est documentée sur Méthode Composable Commerce Stack Nehos™. Chaque mission démarre par un cadrage structuré : objectifs chiffrés, périmètre technique, jalons à 30/60/90 jours. Les résultats mesurés sur nos clients : 38 % est un ordre de grandeur courant. On livre, on mesure, on itère. Pas de slides sans livrable.

#Termes associés

Pour aller plus loin, explorez les termes connexes.

Explorez chaque définition pour construire une vision complète du sujet.

Applications Concrètes

Contexte : BFF (Backend For Frontend) — app mobile + web admin avec données imbriquées

"Plateforme SaaS B2B Nehos : frontend Next.js web consomme des données larges (dashboards), app mobile React Native consomme des données légères (synthèse). Un seul backend GraphQL avec deux requêtes distinctes. Payload mobile réduit de 38 % vs l'ancien REST avec réponses fixes. Temps de développement frontend divisé par 1,8 sur les nouveaux écrans."

Contexte : API publique stable — microservices simples

"API REST Payload CMS exposant des collections Content, Media, Users via endpoints standardisés. Simple, documentée automatiquement, cacheable sur CDN (Cloudflare). Pas besoin de GraphQL : les données sont simples, un seul type de client (frontend Next.js), les réponses fixes suffisent. Maintenable par une équipe junior sans formation GraphQL."

Contexte : Architecture multi-clients omnicanal (web + mobile + TV + kiosques)

"Retailer omnicanal : site web Next.js, app iOS/Android, bornes kiosques en magasin et intégration TV connectée consomment le même backend catalogue. GraphQL permet à chaque client de demander la forme de données adaptée à son contexte. Évite de créer 4 endpoints REST différents ou de renvoyer des réponses surdimensionnées sur les bornes kiosques."

Questions & Réponses

Questions fréquentes sur GraphQL vs REST

Avec REST, un endpoint /users retourne tous les champs d'un utilisateur (nom, email, adresse, préférences, historique…) même si le client n'a besoin que du nom et de l'avatar. Avec GraphQL, le client déclare exactement les champs voulus dans sa requête. Le serveur retourne exactement cette forme, sans surplus. Sur mobile avec une connexion 4G limitée, cette réduction peut atteindre -30 à -50 % de payload JSON selon la richesse du modèle de données.
Le problème N+1 survient quand GraphQL résout une liste de N objets et effectue une requête SQL séparée pour chaque sous-ressource : 1 requête pour la liste + N requêtes pour les détails = N+1 aller-retours en base. Résultat : une requête GraphQL simple peut générer des centaines de requêtes SQL. La solution standard est le pattern DataLoader (batching + caching) : les sous-requêtes sont regroupées en une seule requête SQL avec IN clause. Obligatoire dès qu'une relation imbriquée est exposée.
Le cache HTTP standard (CDN, browser, proxy) fonctionne sur les URLs des requêtes GET. GraphQL envoie toutes ses requêtes en POST vers un endpoint unique (/graphql), avec le corps de la requête comme payload JSON. Les caches HTTP ne lisent pas les corps de requête — ils ne peuvent donc pas distinguer deux requêtes GraphQL différentes. Solutions possibles : GET persisté (PersistedQueries), cache applicatif côté serveur (Redis avec clé basée sur le hash de la requête), ou Apollo Studio avec caching de type field-level.
REST est généralement le meilleur choix pour une API publique destinée à des clients tiers (intégrateurs, partenaires). Raisons : documentation plus simple (Swagger/OpenAPI), versioning explicite (v1, v2) qui protège les clients existants lors d'évolutions, apprentissage plus rapide pour des équipes tierces, cache HTTP natif. GraphQL est plus pertinent pour vos propres frontends internes où vous contrôlez le client et pouvez itérer le schéma. Avis Nehos : ne choisissez GraphQL en public que si vos clients sont des développeurs avancés — Shopify l'a fait avec succès, mais c'est une exception.
Oui, c'est même une pratique courante. L'approche BFF (Backend For Frontend) consiste à exposer REST pour les APIs publiques ou les intégrations tierces, et GraphQL pour les frontends propriétaires. Exemple Nehos : Payload CMS expose REST en interne pour les intégrations ERP et webhooks, tandis qu'un layer Apollo GraphQL est ajouté pour les frontends Next.js qui ont besoin de requêtes déclaratives complexes. Les deux coexistent sans conflit.
tRPC est un framework TypeScript-first qui génère automatiquement un contrat d'API typé entre un serveur Node.js et un client TypeScript, sans schéma SDL à écrire. Contrairement à GraphQL, tRPC n'est pas un langage de requête — c'est du RPC (Remote Procedure Call) avec inférence de types end-to-end. Avantage : zéro boilerplate, refactoring sûr IDE. Inconvénient : ne convient qu'à des stacks full-TypeScript (pas de clients mobiles non-TS, pas d'API publique multi-langage). Voir notre glossaire tRPC.
REST par défaut sur tous les projets Payload CMS — le CMS génère automatiquement des endpoints REST pour chaque collection, bien documentés, cachés sur Cloudflare. GraphQL est ajouté spécifiquement quand le frontend est complexe avec des relations très imbriquées, ou quand plusieurs clients hétérogènes (mobile + web + kiosque) consomment les mêmes données avec des besoins différents. tRPC est utilisé sur les monorepos Next.js full-stack où le serveur et le client sont dans le même dépôt TypeScript.
Réserver un audit