Go to blue arrow
back to Tech Blog
Développement
João Inez

6 août 2026

Min Read

GraphQL vs REST (2026) : choisir la bonne API

Code JavaScript affiché dans un éditeur de texte au thème sombre, avec une arborescence de fichiers visible sur la gauche.

Lorsque vous commencez à concevoir une API, vous pensez immédiatement à REST. C'est la norme depuis deux décennies, et les normes sont rassurantes. Mais GraphQL s'impose de plus en plus, et GraphQL vs REST est désormais l'une des premières décisions architecturales qu'une équipe produit doit prendre.

Ne faisons pas durer le suspense. Choisissez GraphQL lorsque différents clients ont besoin de formats de données variés à partir d'une même source. Choisissez REST lorsque la mise en cache, la surveillance et la simplicité opérationnelle priment sur la flexibilité des requêtes. La plupart des organisations finissent par utiliser les deux, et c'est très bien ainsi.

Imaginez une cuisine. REST sert le même menu à toutes les tables, et si vous voulez un accompagnement, vous devez commander un second plat. GraphQL vous donne un carnet de commande et vous laisse noter exactement ce que vous voulez. La nourriture est la même, la cuisine aussi. Ce qui change, c'est qui compose l'assiette, et ce que cette décision implique pour vous par la suite.

C'est sur ce dernier point que cet article se concentre : les fonctionnalités, les différences réelles, ainsi que les conséquences en termes de coûts, de risques et de livraison selon le choix effectué.

Points clés

  • GraphQL résout les problèmes de sur-récupération et de sous-récupération de données en permettant au client de demander précisément les champs dont il a besoin via un point de terminaison unique. Son véritable avantage réside dans la vitesse de livraison pour des clients variés, plutôt que dans la vitesse brute des requêtes.
  • REST bénéficie nativement de la mise en cache HTTP, de la surveillance par codes d'état et d'un coût maîtrisé par point de terminaison, ce qui explique pourquoi il reste la norme pour les API publiques et celles à forte lecture.
  • La décision honnête concerne vos clients, votre équipe et vos opérations, et non la technologie qui semble la plus moderne. La plupart des infrastructures utilisent les deux, souvent en plaçant une couche GraphQL devant des services REST existants.
  • Depuis l'édition de septembre 2025 de la spécification GraphQL, la première édition complète depuis octobre 2021, le langage a intégré les coordonnées de schéma (Schema Coordinates), les objets d'entrée OneOf et les descriptions de documents exécutables, plusieurs étant directement destinés à la génération de code et aux outils basés sur les LLM ou les agents.
blue arrow to the left
Imaginary Cloud logo

Qu'est-ce que GraphQL ?

GraphQL est un langage de requête pour API qui permet une récupération déclarative des données. En termes simples : le client précise exactement les données dont il a besoin et ne reçoit que celles-ci. Cela facilite également l'évolution des API au fil du temps. Son fonctionnement est défini dans une spécification publique, ce qui en fait un véritable standard plutôt qu'un produit propriétaire.

Trois idées reçues à dissiper, car elles reviennent systématiquement lors des premières discussions.

  • Il n'a rien à voir avec les bases de données. Ce n'est pas une alternative au SQL, ni un nouvel ORM (Object-Relational Mapper), cette couche qui fait le pont entre les tables d'une base de données et les objets manipulés par votre code.
  • Ce n'est pas un remplaçant de REST. C'est une alternative. Vous n'avez pas à choisir l'un plutôt que l'autre ; ils cohabitent parfaitement au sein d'un même projet, comme c'est déjà le cas dans la plupart des architectures.
  • Ce n'est pas difficile à lire. La syntaxe s'apprend en un après-midi. La difficulté réside ailleurs : dans la mise en cache, l'autorisation et le coût des requêtes, ce qui constitue précisément le cœur de cet article.

Qui a créé GraphQL

GraphQL a été développé en interne par Facebook (aujourd'hui Meta) en 2012, avant de devenir open source en septembre 2015. Il a été co-créé par Lee Byron, Nick Schrock et Dan Schafer alors qu'ils travaillaient sur les applications mobiles de Facebook. Gardez ce contexte à l'esprit, car il explique la plupart des choix de conception qui suivent.

L'intention de transférer le projet vers une GraphQL Foundation neutre vis-à-vis des fournisseurs, annoncée en novembre 2018, a abouti à la création officielle de la Fondation en 2019.

Il est essentiel de noter que la spécification n'est pas restée figée en 2018. L' édition de septembre 2025, la première édition complète depuis octobre 2021, a introduit les Coordonnées de schéma (des adresses lisibles par les machines et les humains pour les éléments de schéma), les objets d'entrée OneOf (des entrées mutuellement exclusives exprimées dans le schéma), ainsi que des descriptions sur les documents exécutables. Plusieurs de ces fonctionnalités ont été conçues en pensant aux outils de génération de code et aux agents basés sur des LLM, ce qui est important si votre API est de plus en plus consommée par des outils d'IA plutôt que uniquement par des humains.

Quelles entreprises utilisent GraphQL

GraphQL est utilisé par des équipes de toutes tailles, dans de nombreux environnements et langages. Les utilisateurs les plus connus sont Facebook, GitHub, Pinterest, Shopify, Airbnb et Netflix.

Une requête GraphQL en contexte

Avant toute comparaison, voici une requête GraphQL simple qui récupère un utilisateur ainsi que son nom et son âge :

{
  user(id: "1") {
    name
    age
  }
}

Et la réponse JSON que vous obtenez en retour :

{
  "data": {
    "user": {
      "name": "João Inez",
      "age": 29
    }
  }
}

Remarquez que la réponse reflète la requête, champ par champ. C'est là tout l'intérêt de l'aspect déclaratif : vous écrivez des objets JSON sans les valeurs, et vous pouvez lire ce qu'une requête renverra sans jamais avoir à l'exécuter.

blue arrow to the left
Imaginary Cloud logo

Qu'est-ce que REST ?

REST a été défini par Roy Fielding, l'informaticien qui en a établi les principes dans sa thèse de doctorat en 2000.

REST (Representational State Transfer) est un style d'architecture logicielle qui définit un ensemble de contraintes faisant d'un service web une véritable API RESTful. Ces contraintes sont les suivantes :

  • Architecture client-serveur. Les préoccupations liées à l'interface utilisateur doivent être séparées de celles liées au stockage des données. En procédant ainsi, votre interface est facilement portable sur différentes plateformes, ce qui constitue, en somme, toute la promesse de cette architecture.
Schéma d'architecture client-serveur montrant le flux de requêtes/réponses dans les API REST et GraphQL.
  • Absence d'état (Stateless). Un serveur sans état ne conserve aucune information sur l'utilisateur qui appelle l'API. Il ne se souvient pas s'il s'agit de votre première requête ou de la centième, car chaque requête contient tout ce qui est nécessaire pour y répondre.
Schéma de 3 ordinateurs clients connectés à un serveur central, illustrant une architecture REST sans état.
  • Mise en cache (Cacheability). Les réponses d'une API REST doivent déclarer si elles peuvent être mises en cache ou non. Sans cette déclaration, les clients réutilisent volontiers des données qui ne sont plus valides depuis dix minutes.
  • Système en couches. Si un proxy ou un équilibreur de charge s'interpose entre le client et le serveur, la connexion entre eux n'en est pas affectée. Le client n'a jamais besoin de savoir s'il communique directement avec le serveur final.
  • Interface uniforme. Il doit exister une manière cohérente d'interagir avec un serveur donné, quel que soit le type d'appareil ou d'application. La règle principale : chaque ressource doit être identifiée dans les requêtes.

Réunissez ces cinq principes et vous obtenez des clients, des intermédiaires et des serveurs de ressources qui communiquent tous via une interface commune et mise en cache. C'est sur cette propriété que repose tout le reste de cet article. Comme l'interface est uniforme et adressable, tout élément intermédiaire, du cache du navigateur à un réseau de diffusion de contenu (CDN), peut traiter une réponse sans avoir besoin d'en comprendre le contenu.

blue arrow to the left
Imaginary Cloud logo

Pourquoi GraphQL a-t-il été créé alors que REST existait déjà ?

Deux raisons ont poussé des entreprises comme Facebook, Netflix et Coursera à chercher des alternatives :

  • Au début des années 2010, l'explosion de l'usage mobile a imposé des appareils moins puissants et des réseaux instables. REST n'est pas optimal dans ces conditions.
  • Avec la montée en puissance du mobile, le nombre de frameworks front-end et de plateformes exécutant des applications clientes a explosé. En raison du manque de flexibilité de REST, il est devenu difficile de développer une API unique capable de répondre aux besoins de chaque client.

Si l'on va plus loin, la véritable raison réside dans la structure des données. La plupart des données des applications web et mobiles modernes sont organisées sous forme de graphe, un réseau d'entités connectées plutôt qu'une pile de tables plates. Les articles ont des commentaires, et ces commentaires ont des mentions « j'aime » ou des signalements de spam, créés ou rapportés par des utilisateurs. Récupérer ces informations via des appels par ressource signifie parcourir le graphe une requête à la fois, ce qui est aussi lent que cela en a l'air.

Facebook a donc commencé à développer GraphQL. Netflix et Coursera travaillaient sur leurs propres alternatives au même moment. Après que Facebook a rendu GraphQL open source, Coursera a abandonné ses travaux pour adopter cette nouvelle technologie. Netflix a poursuivi ses efforts et a plus tard rendu open source Falcor, une bibliothèque JavaScript qui modélise les données distantes sous la forme d'un graphe JSON virtuel. Falcor est aujourd'hui largement inactif ; considérez-le donc comme une note de bas de page historique plutôt que comme une option viable.

blue arrow to the left
Imaginary Cloud logo

GraphQL est-il meilleur que REST ?

GraphQL propose un langage de requête qui permet aux clients de ne demander que les données dont ils ont besoin. REST repose sur des points de terminaison fixes et des structures de données définies par le serveur. Déterminer si GraphQL est « meilleur » dépend de vos besoins et de la flexibilité requise par votre projet : GraphQL l'emporte sur la flexibilité côté client et la rapidité de livraison front-end ; REST gagne sur la mise en cache, le monitoring et la maturité opérationnelle. Le guide de décision d'Amazon pour GraphQL présente ce même compromis en termes de coût total de possession, ce qui constitue un second avis utile pour construire votre argumentaire en interne.

Diagramme comparatif des modèles de récupération de données client-serveur : GraphQL vs REST.

Étudions un exemple pratique, point par point.

Imaginez que vous ayez un blog et que vous souhaitiez afficher tous les derniers articles sur la page d'accueil. Vous devez récupérer les articles, vous écririez donc probablement quelque chose comme ceci :

GET /api/posts

[
  { "id": 1, "title": "GraphQL vs REST", "subtitle": "Choosing an API", "date": "2026-02-21" },
  { "id": 2, "title": "Scaling a mobile back end", "subtitle": "Lessons learned", "date": "2026-02-14" }
]

Mais que faire si vous voulez aussi l'auteur ? Trois options s'offrent à vous :

1. Récupérer les auteurs depuis une autre ressource :

GET /api/posts
GET /api/authors?ids=1,2

[
  { "id": 1, "name": "João Inez" },
  { "id": 2, "name": "Ana Silva" }
]

2. Modifier la ressource pour qu'elle renvoie également l'auteur :

GET /api/posts

[
  {
    "id": 1,
    "title": "GraphQL vs REST",
    "subtitle": "Choosing an API",
    "date": "2026-02-21",
    "author": { "id": 1, "name": "João Inez" }
  }
]

3. Créer une ressource qui renvoie les articles avec l'auteur :

GET /api/posts-with-authors

[
  {
    "id": 1,
    "title": "GraphQL vs REST",
    "author": { "id": 1, "name": "João Inez" }
  }
]

Chaque option résout le problème tout en en créant un nouveau. Examinons-les une par une.

Sous-récupération (Under-fetching)

Avec la première approche, qui consiste à récupérer les auteurs depuis une autre ressource, vous vous retrouvez avec deux requêtes serveur au lieu d'une. À grande échelle, cela signifie multiplier les requêtes vers davantage de points de terminaison juste pour assembler une seule vue. Sur une connexion mobile, chaque aller-retour génère une latence que votre utilisateur ressentira immédiatement.

Avec GraphQL, cela n'arrive pas. Une seule requête, aucun aller-retour supplémentaire :

{
  posts {
    title
    subtitle
    date
    author {
      name
    }
  }
}
{
  "data": {
    "posts": [
      {
        "title": "GraphQL vs REST",
        "subtitle": "Choosing an API",
        "date": "2026-02-21",
        "author": { "name": "João Inez" }
      }
    ]
  }
}

Sur-récupération (Over-fetching)

La deuxième approche, modifier la ressource pour qu'elle renvoie aussi l'auteur, résout bien le problème immédiat. Mais elle en crée discrètement un autre ailleurs dans votre application : la sur-récupération.

Revenons à votre blog. Cette fois, vous avez également une barre latérale listant les meilleurs articles du mois avec leurs titres, sous-titres et dates, et elle utilise le /api/posts ressource. Vous avez modifié cette ressource, elle renvoie donc désormais également l'auteur. La barre latérale n'a pas besoin de l'auteur, mais chaque client appelant ce point de terminaison en paie le prix quoi qu'il arrive.

Pour les utilisateurs disposant de forfaits de données limités et de connexions lentes, les données inutiles représentent un coût réel. GraphQL permet au client de demander uniquement les champs dont il a besoin, de sorte que le problème ne se pose jamais :

{
  posts(sort: "monthly_top", limit: 5) {
    title
    subtitle
    date
  }
}
{
  "data": {
    "posts": [
      { "title": "GraphQL vs REST", "subtitle": "Choosing an API", "date": "2026-02-21" }
    ]
  }
}

Ralentissement du développement front-end

Ce qui nous amène à la troisième approche : créer une ressource qui renvoie les articles avec l'auteur. Structurer les points de terminaison autour des vues de votre projet est un modèle assez courant.

Cela résout bien le problème ci-dessus. Mais cela ralentit également le développement front-end, car chaque vue spécifique nécessite désormais son propre point de terminaison. Une vue a besoin d'un nouveau champ, et le travail front-end est bloqué jusqu'à ce que l'équipe back-end déploie la mise à jour. Ce coût de coordination est celui que les équipes sous-estiment systématiquement.

GraphQL confie plutôt le carnet de commandes au client. L'ajout d'un champ ne nécessite aucune mise à jour back-end. Vous passez de ceci :

{
  posts {
    title
    author {
      name
    }
  }
}

À ceci :

{
  posts {
    title
    subtitle
    date
    author {
      name
      avatarUrl
    }
  }
}

Aucun changement back-end n'est nécessaire entre les deux.

Bannière dev web et mobile : écran d'ordinateur isométrique et application smartphone avec logo React.
blue arrow to the left
Imaginary Cloud logo

Comparaison entre GraphQL et REST

DimensionGraphQLREST
Récupération des donnéesLe client spécifie les champs ; une seule requête renvoie exactement ces champsLe serveur définit la réponse ; les données associées nécessitent d'autres appels
Endpoints (Points de terminaison)Un seul endpoint pour l'ensemble du schémaUn endpoint par ressource
Mise en cacheÀ concevoir soi-même, côté client ou via une couche de requêtes persistantes (persisted queries)Inclus nativement via HTTP ; fonctionne dans le navigateur et au niveau du CDN
Gestion des erreurs200 OK avec un tableau d'erreurs ; nécessite des outils compatibles avec GraphQLCodes d'état HTTP, pris en charge par tous les outils de surveillance
AutorisationAppliquée par champ ou par résolveur (resolver)Appliquée par endpoint
Gestion des versionsAdditifs ; les anciens champs sont marqués @deprecatedExplicite, généralement de /v1/ à /v2/
Limitation du débit (Rate limiting)Par coût et profondeur de requête, car le coût des requêtes variePar nombre de requêtes par minute, car le coût est pratiquement uniforme
Cas d'usage idéalPlusieurs clients différents connectés à un même back-endAPIs publiques, trafic à forte composante de lecture et facilement mise en cache

Les différences entre GraphQL et REST

Récapitulatif rapide des différences et de ce qu'elles impliquent :

  • GraphQL est un langage et un ensemble d'outils utilisant HTTP via un point de terminaison unique pour optimiser la flexibilité et les performances.
  • Dans GraphQL, les données sont organisées sous forme de graphe et les objets sont structurés en nœuds selon un schéma.
  • REST est un concept architectural pour les logiciels réseau, et il demeure la norme pour la plupart des API publiques.
  • GraphQL résout les problèmes de sur-récupération et de sous-récupération de données en permettant au client de ne demander que les informations dont il a besoin.
  • Comme le client contrôle la forme de la réponse, les équipes front-end peuvent ajouter des champs sans attendre une mise à jour du back-end. C'est là, et non dans la vitesse brute, que réside le véritable gain de productivité.
  • Dans GraphQL, l'identité d'un objet est distincte de la manière dont le développeur le récupère. Dans REST, le point de terminaison constitue l'identité de l'objet.
  • Dans GraphQL, le serveur publie ce qui est disponible et le client décide de ce qu'il récupère. Dans REST, la taille de la ressource est définie par le serveur.
  • Dans GraphQL, une seule requête peut appeler plusieurs résolveurs — les fonctions côté serveur qui récupèrent les données derrière chaque champ — pour assembler une réponse provenant de sources multiples. Dans REST, une requête appelle généralement un seul gestionnaire de route.
  • Comme GraphQL suit les relations définies dans le schéma, vous pouvez naviguer depuis le point d'entrée vers des données associées en une seule requête. REST nécessite d'appeler plusieurs points de terminaison pour récupérer des ressources liées.

Les points communs entre REST et GraphQL

Comme nous l'avons dit, GraphQL ne remplace pas REST. Au-delà de leurs différences, les deux approches ont beaucoup en commun, ce qui explique pourquoi le choix entre REST et GraphQL est rarement exclusif :

  • Tous deux utilisent HTTP, généralement via une requête POST ou GET vers une URL, et renvoient du JSON.
  • Tous deux permettent de spécifier des identifiants pour les ressources.
  • GraphQL (champs) comme REST (points de terminaison) appellent des fonctions sur le serveur.
  • Tous deux disposent de points d'entrée vers les données. Dans une API GraphQL, la liste des champs à la racine Query et Mutation joue le même rôle que la liste des points de terminaison dans une API REST. Une mutation, soit dit en passant, est simplement une opération GraphQL qui écrit des données au lieu de les lire.
  • Tous deux font la distinction entre la lecture et l'écriture de données.
blue arrow to the left
Imaginary Cloud logo

À quoi sert GraphQL

GraphQL a été conçu pour les clients mobiles, et c'est toujours là qu'il prouve sa valeur. Une application mobile fonctionne sur une connexion que vous ne maîtrisez pas ; chaque champ inutile et chaque aller-retour supplémentaire se traduit donc par une latence ressentie par l'utilisateur. Repensez à l'exemple de sur-récupération : la barre latérale nécessitait trois champs, et le point de terminaison REST modifié en renvoyait cinq, dont un objet auteur imbriqué que l'interface n'affichait jamais. Multipliez cela à l'échelle d'un écran, sur un réseau médiocre, et le résultat est flagrant.

Plus vous servez de clients à partir d'un même backend, et plus ils diffèrent les uns des autres, plus cet aspect est crucial. C'est également une solution adaptée lorsque le frontend évolue plus rapidement que le backend, car le schéma absorbe les changements qui nécessiteraient autrement de nouveaux points de terminaison.

C'est l'archétype pour lequel nous développons le plus souvent : une API à faible latence desservant plusieurs clients à partir d'un backend unique. Sur TrustPortal, par exemple, nous avons livré les applications web et mobiles ainsi que les services API sous-jacents, optimisés pour une faible latence et conçus pour fonctionner dans de nombreuses langues pour une base d'utilisateurs internationale. C'est exactement la situation où une couche de données unique, adaptée aux besoins du client, s'avère payante, que vous y accédiez via GraphQL ou via une API REST soigneusement conçue.

blue arrow to the left
Imaginary Cloud logo

À quoi sert REST ?

GraphQL est un outil puissant, mais il n'est pas complet. Si l'un des points suivants est important pour votre projet, envisagez REST.

REST bénéficie nativement du cache HTTP

Chaque navigateur intègre un cache HTTP qui évite de récupérer inutilement des ressources et détermine si deux ressources sont identiques. Cela ne vous coûte rien, tout le monde le comprend, et cela fonctionne aussi bien au niveau du CDN que dans le navigateur.

GraphQL ne possède pas d'identifiant unique global pour un objet au niveau de l'URL, car chaque requête est envoyée au même point de terminaison, généralement via POST. Pour mettre en place une mise en cache, vous devez le faire vous-même, soit côté client (Apollo Client, Relay, urql), soit via une couche de requêtes persistantes devant le serveur. C'est un travail réel qui augmente la complexité opérationnelle. Une API REST obtient cela directement du protocole et s'associe naturellement à un cache comme Redis ou Memcached.

REST signale les erreurs via les codes de statut HTTP

Avec REST, vous pouvez construire un système de surveillance basé sur les codes de statut. Une erreur 500 est un incident, une 404 signifie qu'une ressource est manquante, et une 200 signifie que tout va bien. GraphQL ne vous offre rien de tel, car il renvoie 200 OK pour presque tout, y compris les échecs. Une erreur GraphQL typique ressemble à ceci :

{
  "errors": [
    {
      "message": "Cannot query field \"avatarURL\" on type \"Author\".",
      "locations": [{ "line": 5, "column": 7 }],
      "path": ["posts", 0, "author"]
    }
  ],
  "data": null
}

Gérer et surveiller différents scénarios d'erreur à partir de cette réponse est plus complexe, et les outils d'alerte standards basés sur les codes de statut HTTP ne détecteront pas l'échec. Vous avez besoin d'une instrumentation spécifique à GraphQL avant même d'envisager une mise en production.

REST a un coût limité par point de terminaison

Avec GraphQL, vous pouvez interroger exactement ce que vous voulez quand vous le voulez, et cette liberté a des conséquences sur la sécurité. Si un acteur malveillant soumet une requête imbriquée coûteuse pour surcharger votre serveur ou votre base de données, et que votre serveur n'a pas de protections en place, vous êtes exposé à des attaques par déni de service (DoS). La OWASP GraphQL Cheat Sheet est claire à ce sujet : la profondeur et le volume des requêtes sont illimités par défaut, vous devez donc ajouter vos propres limites. Un point de terminaison REST a un coût limité par construction. Une requête GraphQL, elle, n'en a pas.

blue arrow to the left
Imaginary Cloud logo

Sécurité, versioning et opérations

La plupart des comparaisons s'arrêtent au sur-chargement des données (over-fetching). Pourtant, ce sont les différences opérationnelles qui déterminent réellement le succès une fois l'API en production et sous la responsabilité d'une équipe d'astreinte.

Authentification et autorisation

L'authentification est pratiquement identique dans les deux cas : un jeton dans l'en-tête, validé à chaque requête. L'autorisation est une autre paire de manches. En REST, les contrôles d'accès se situent au niveau du point de terminaison (endpoint), et il suffit de lire la table de routage pour savoir qui peut appeler quoi. En GraphQL, une seule requête peut parcourir plusieurs types, les autorisations doivent donc être appliquées par champ ou par résolveur. Cela représente plus de code, et ce code doit être exhaustif : un seul champ non protégé sur un type imbriqué révélera les données que le point de terminaison supérieur était censé protéger. L'OWASP recommande d'appliquer l'autorisation à la fois sur les nœuds et sur les arêtes précisément parce qu'il est très facile de laisser cette faille ouverte.

Limitation de débit et profondeur de requête

La limitation de débit par nombre de requêtes par minute fonctionne pour REST, où les requêtes ont un coût globalement similaire. Cela ne fonctionne pas pour GraphQL, où une requête peut être triviale tandis qu'une autre peut interroger la moitié de votre base de données. Les API GraphQL nécessitent des limites de profondeur de requête, un système de score de complexité attribuant un coût à chaque champ, et souvent des requêtes persistantes, qui n'autorisent qu'un ensemble d'opérations pré-approuvées en production. Prévoyez ce travail dès maintenant, plutôt que de le découvrir lors d'un incident.

Versioning

REST gère le versioning par URL, /v1/ vers /v2/, ce qui est explicite, facile à communiquer, mais vous oblige à maintenir les deux versions. GraphQL évite le versioning : vous ajoutez des champs et dépréciez les anciens avec la directive @deprecated , et les clients migrent à leur propre rythme. C'est réellement utile pour un schéma desservant de nombreux clients, avec une obligation à la clé : suivez l'utilisation des champs, sinon les champs dépréciés ne seront jamais supprimés et le schéma ne cessera de croître.

Le problème N+1

Comme un résolveur GraphQL s'exécute pour chaque champ, une requête portant sur 50 articles et leurs auteurs peut déclencher 51 requêtes en base de données : une pour les articles, et une par auteur. C'est le problème N+1, et c'est la raison la plus fréquente pour laquelle une toute nouvelle API GraphQL s'avère plus lente que l'API REST qu'elle remplace. La solution consiste à utiliser le traitement par lots (batching) pour regrouper ces 50 recherches d'auteurs en un seul appel en base de données, généralement avec DataLoader ou une bibliothèque équivalente. Ce n'est pas optionnel dès lors que le volume est significatif. REST n'échappe pas non plus au problème N+1, mais comme le modèle de requête derrière un point de terminaison est fixe, il apparaît dès le développement plutôt qu'en charge en production.

blue arrow to the left
Imaginary Cloud logo

Fédération GraphQL et spécification de schéma composite

Depuis les débuts de GraphQL, un élément a radicalement modifié la donne : on ne construit plus guère de graphe monolithique. La fédération permet à plusieurs équipes de gérer chacune un sous-graphe, qu'une passerelle assemble en un graphe unique que le client interroge comme s'il s'agissait d'une API unique. Si votre organisation est suffisamment grande pour que le débat « GraphQL vs REST » se résume à « comment plusieurs équipes peuvent-elles exposer une API cohérente », c'est le modèle à privilégier.

L'écosystème se standardise également sur ce point. Les travaux de la GraphQL Foundation sur la spécification de schéma composite visent à rendre les graphes multi-services portables entre les passerelles, plutôt que liés à l'implémentation d'un seul fournisseur. Il est important de le mentionner dans toute comparaison en 2026, car cela modifie le calcul opérationnel : la fédération ajoute une couche de composition et de passerelle à gérer, en plus de tout ce qui a été mentionné précédemment.

REST n'a pas d'équivalent direct. L'analogue le plus proche est une passerelle d'API assemblant plusieurs services, mais sans système de typage partagé entre eux. Si l'objectif est d'obtenir un graphe unifié et fortement typé entre plusieurs équipes, c'est un point pour GraphQL. Si chaque service peut fonctionner de manière autonome derrière ses propres points de terminaison, REST permet de simplifier les choses.

La place actuelle de gRPC et tRPC

Le débat GraphQL vs REST ne résume pas tout le paysage. gRPC est une option solide pour le trafic interne entre services, où un protocole binaire et des clients générés surpassent le JSON lisible par l'humain, et où aucun navigateur n'effectue d'appel. tRPC mérite d'être étudié lorsque les deux extrémités de la pile sont en TypeScript au sein d'une même base de code, car il offre une sécurité de type de bout en bout sans langage de schéma ni étape de génération de code. Attention toutefois, il ne pourra pas servir un client que vous ne contrôlez pas.

En résumé : REST pour les API publiques et tierces, GraphQL pour les clients internes variés, gRPC pour le trafic interne entre services, et tRPC pour les produits full-stack TypeScript. Les grandes infrastructures utilisent souvent plusieurs de ces solutions. C'est un état final tout à fait normal, et non un échec de standardisation.

Aperçu des fonctionnalités de GraphQL

Deux fonctionnalités n'ont aucun équivalent dans REST, et toutes deux transforment la manière dont les équipes travaillent plutôt que la performance de l'API.

Schéma et système de typage

GraphQL utilise son propre système de typage pour définir le schéma d'une API, via une syntaxe appelée Schema Definition Language (SDL). Le schéma constitue un contrat entre le serveur et le client, définissant la manière dont ce dernier peut accéder aux données.

type Author {
  id: ID!
  name: String!
  posts: [Post!]!
}

type Post {
  id: ID!
  title: String!
  subtitle: String
  date: String!
  author: Author!
}

type Query {
  posts(limit: Int): [Post!]!
  user(id: ID!): Author
}

Une fois ce schéma établi, les équipes front-end et back-end peuvent travailler indépendamment, car le front-end peut être testé à l'aide de données fictives générées à partir de celui-ci. Le front-end peut également lire les types, requêtes et mutations du schéma grâce à l' introspection, la capacité intégrée d'interroger le schéma lui-même pour obtenir la liste des types et champs disponibles. Vous bénéficiez en outre d'une sécurité de type qui permet de détecter les erreurs de typage très tôt des deux côtés. Les coordonnées de schéma (Schema Coordinates) de la spécification de septembre 2025 permettent d'adresser ce schéma introspecté de manière standard, ce qui est très pratique pour la génération de code, les registres et les outils d'IA.

IDE GraphQL

L'IDE GraphQL est l'un des outils les plus utiles de la chaîne de développement. Il tire parti de la nature autodocumentée du schéma pour éliminer la majeure partie des incertitudes liées au travail d'intégration.

Utilisez un client actuel et maintenu tel que GraphiQL (maintenu par la GraphQL Foundation), Apollo Sandbox ou Altair pour inspecter votre schéma et exécuter des requêtes et des mutations sur votre API sans avoir à écrire de client au préalable.

Remarque sur la mise à jour des outils : l'ancien GraphQL Playground a été retiré et supprimé d'Apollo Server 3. Il n'est plus maintenu depuis 2019 et présente des vulnérabilités de sécurité connues ; privilégiez donc GraphiQL, Apollo Sandbox ou Altair pour tout nouveau projet.

L'argument commercial : coût, risque et retour sur investissement

La comparaison technique ne suffit que rarement à trancher. Ce qui fait la différence, c'est la vitesse de livraison, les coûts opérationnels et les risques que vous acceptez de prendre.

  • Effort de migration. Migrer une architecture REST existante vers GraphQL ne revient pas à réécrire le back-end. Il s'agit d'ajouter une nouvelle couche en amont, tout en effectuant un travail supplémentaire sur chaque client. En pratique, la conception du schéma et la migration des clients prennent plus de temps que la mise en place du serveur, et la migration n'est terminée que lorsque les anciens points de terminaison sont désactivés. Les équipes qui laissent les deux systèmes fonctionner indéfiniment finissent par payer pour deux API sans bénéficier des avantages d'aucune.
  • Compétences de l'équipe et outils. GraphQL exige davantage de l'équipe back-end : conception des résolveurs, traitement par lots, limites de complexité, autorisation au niveau des champs, observabilité adaptée à GraphQL. REST est moins exigeant et les profils compétents sont plus faciles à recruter. Si votre équipe est restreinte ou si l'API n'est qu'une des nombreuses responsabilités qu'elle gère, cet écart se creuse rapidement.
  • Où le temps est réellement économisé. Le schéma fait office de contrat, et c'est ce contrat qui accélère la livraison. Les équipes front-end et back-end cessent de négocier la structure des points de terminaison et ne se bloquent plus mutuellement lors des déploiements. Le retour sur investissement est visible sur les produits où plusieurs clients utilisent un même back-end : web, iOS, Android, intégration partenaire. C'est le modèle utilisé pour des projets comme TrustPortal et l'intégration API que nous avons conçue pour Game Achievements. Sur un client web unique avec un modèle de données stable, cet avantage est généralement inexistant.
  • Charge opérationnelle. Mise en cache à concevoir soi-même. Alertes ne pouvant s'appuyer sur des codes d'état. Limites de coût des requêtes à ajuster. Il s'agit de coûts récurrents, et non ponctuels, qui sont le plus souvent oubliés dans les estimations.

Le test des cinq questions API d'Imaginary Cloud

Voici la liste de contrôle que nos ingénieurs utilisent lors de la phase de découverte d'une API, avant même d'écrire une ligne de code. Répondez aux cinq questions. Si trois réponses ou plus convergent vers une même solution, la voie à suivre est claire.

  1. Diversité des clients. Combien de clients différents utilisent cette API, et dans quelle mesure ont-ils besoin de structurer les mêmes données différemment ? Un seul client oriente vers REST. Quatre clients différents orientent vers GraphQL.
  2. Sensibilité de la charge utile. Vos utilisateurs sont-ils sur des réseaux limités ou des forfaits de données restreints, où un champ inutile représente un coût réel pour eux ? Si oui, GraphQL est préférable.
  3. Besoins en mise en cache. Votre trafic est-il principalement composé de lectures et peut-il être mis en cache en périphérie ? La mise en cache HTTP gratuite est l'argument le plus solide en faveur de REST, et devoir la reconstruire représente le coût caché le plus important lors d'une migration.
  4. Topologie d'équipe. Vos équipes front-end et back-end sont-elles distinctes et suivent-elles des cycles de publication différents ? C'est précisément là qu'un contrat de schéma prend toute sa valeur.
  5. Maturité de la surveillance. Quelle part de vos alertes repose aujourd'hui sur les codes d'état HTTP ? Plus votre système est mature, plus vous devrez reconstruire d'éléments avant de pouvoir déployer une API GraphQL en production en toute sécurité.

Répondez honnêtement à ces questions et la décision sera généralement déjà prise. Le modèle que nous observons le plus souvent dans les produits mobiles consiste à placer une couche GraphQL devant les services REST existants, adoptée client par client plutôt que par une bascule unique.

Choisir entre GraphQL et REST

GraphQL vous offre un environnement de développement flexible et déclaratif, tout en résolvant des problèmes concrets que REST laisse à la charge du client. Il bénéficie d'une vaste communauté, d'un écosystème mature et d'implémentations dans plusieurs langages populaires, dont JavaScript, Go et Java. Cet article aborde les points essentiels pour vous aider à trancher. La spécification GraphQL approfondit considérablement le langage lui-même.

Vous développez une API principalement pour une application mobile ? GraphQL est une première option pertinente, car la bande passante et le nombre d'allers-retours impactent directement l'expérience utilisateur. Vous avez besoin de mise en cache en périphérie (edge caching), d'un monitoring mature et de coûts de requête prévisibles ? REST reste le choix par défaut le plus judicieux.

Alors, GraphQL signe-t-il la fin de REST ? Non, bien sûr que non. Ce n'est pas une technologie parfaite et elle comporte des inconvénients que REST n'a pas. Si l'on devait résumer toute la comparaison en une seule phrase, ce serait celle-ci : Le choix entre GraphQL et REST dépend de vos clients, de votre équipe et de vos opérations, et jamais de la technologie qui semble la plus moderne.

Questions fréquentes

GraphQL remplace-t-il REST ?

Non. L'adoption de GraphQL continue de croître, mais REST reste la norme pour les API publiques et tierces, et la plupart des organisations utilisent les deux. GraphQL est généralement ajouté en amont des services REST existants plutôt que de les remplacer.

GraphQL est-il plus rapide que REST ?

Pour un client ayant besoin de données provenant de plusieurs ressources, oui, car une seule requête remplace plusieurs allers-retours et la charge utile ne contient aucun champ inutile. Pour une ressource unique pouvant être mise en cache, REST est généralement plus rapide, car un cache HTTP ou un CDN peut la servir sans même solliciter votre serveur. Une API GraphQL non optimisée, confrontée au problème N+1, peut être nettement plus lente que l'API REST qu'elle a remplacée.

Dans quels cas ne pas utiliser GraphQL ?

Lorsque votre trafic est principalement constitué de lectures servies par un CDN, lorsque vous avez un client unique avec un modèle de données stable, lorsque vos alertes reposent sur des codes d'état HTTP, ou lorsque l'équipe en charge de l'API est restreinte et déjà surchargée.

GraphQL et REST peuvent-ils coexister ?

Oui, c'est même le modèle courant. Une couche GraphQL est placée devant les services REST existants et résout les champs en les appelant, ce qui vous permet de migrer un client à la fois plutôt que de vous engager dans une transition brutale.

Quel est l'effort nécessaire pour migrer de REST vers GraphQL ?

La partie serveur est la moins complexe. L'effort se concentre sur la conception du schéma, l'autorisation au niveau des champs, le traitement par lots, la mise en cache et la migration côté client. Le travail n'est terminé que lorsque les anciens points de terminaison sont retirés. Planifiez la migration client par client plutôt que comme un projet unique.

Lequel est le plus sécurisé, GraphQL ou REST ?

Aucun n'est intrinsèquement plus sécurisé, mais leurs failles diffèrent. REST a un coût limité par point de terminaison et des contrôles d'autorisation centralisés. GraphQL nécessite une autorisation au niveau des champs, des limites de profondeur et de complexité des requêtes, et généralement des requêtes persistantes, car une seule requête peut être arbitrairement coûteuse et accéder à des types auxquels l'appelant ne devrait pas avoir accès. Le OWASP GraphQL Cheat Sheet est la référence standard pour sécuriser ces aspects.

Qu'est-ce que la fédération GraphQL ?

La fédération permet à plusieurs équipes de gérer chacune un sous-graphe, qu'une passerelle compose en un graphe unique interrogé par le client comme une API unique. La spécification Composite Schema normalise la manière dont ces graphes se composent entre les passerelles. Elle convient aux grandes organisations exposant une API cohérente à partir de nombreux services, au prix de la gestion d'une couche de composition et d'une passerelle.

Quelle est la dernière version de GraphQL ?

L'édition stable actuelle de la spécification GraphQL est l' édition de septembre 2025, la première édition complète depuis octobre 2021. Elle a ajouté les coordonnées de schéma, les objets d'entrée OneOf et des descriptions sur les documents exécutables, dont plusieurs sont destinés aux outils de génération de code et aux outils basés sur des LLM ou des agents.

Travailler avec nous

Vous hésitez entre GraphQL et REST pour le produit que vous développez ? Nous concevons et développons des API pour des produits web et mobiles, allant des plateformes à faible latence comme TrustPortal aux produits grand public à fort volume comme Game Achievements. Nous serions ravis d'échanger avec vous sur les compromis à faire en fonction de vos clients, de votre équipe et de votre feuille de route avant que vous ne fassiez votre choix. Contactez notre équipe.

João Inez
João Inez

Développeur Web, on trouve couramment qu'il tape null au lieu de nil. J'adore explorer le style fonctionnel de Javascript.

Read more posts by this author

People who read this post, also found these interesting:

Dropdown caret icon