Aller au contenu
Guide

REST vs GraphQL vs gRPC : un cadre décisionnel pour 2026

| 10 min read

Un cadre concret pour choisir REST, GraphQL ou gRPC en 2026. Tableau comparatif, exemples de code et critères importants pour chacun.

Road intersection with multiple paths representing architecture choices
Photo by Denys Nevozhai on Unsplash

Votre équipe démarre un nouveau service. Quelqu'un ouvre un fil de discussion Slack : « Devrions-nous utiliser GraphQL ? Quelqu'un d'autre répond avec un lien vers un benchmark gRPC. Le fil se divise en trois camps. Deux heures plus tard, aucune décision.

Le problème n'est pas le manque d'information. Le problème est le manque de critères. REST, GraphQL et gRPC chacun résoudre une forme différente de problème. Choisissez le mauvais et vous payez la taxe sur chaque demande pendant des années. Choisissez la bonne et l’architecture passe au second plan.

Ce guide vous donne un cadre de décision concret, et non « ça dépend ». Chaque protocole reçoit un spécifique cas d'utilisation où il gagne, un exemple de code que vous pouvez exécuter et un tableau de comparaison dans lequel vous pouvez accéder un document de conception.

Le cadre de 30 secondes

Commencez par trois questions :

  1. Qui appelle cette API ? Développeurs externes, vos propres clients frontend ou services internes ?
  2. De combien de formes de données le client a-t-il besoin ? Une forme fixe ou plusieurs variantes ?
  3. Qu'est-ce qui compte le plus : la capacité de cache, la flexibilité des requêtes ou le débit brut ?

Les réponses correspondent directement à un protocole :

  • REPOS gagne lorsque le public est externe, que la forme des données est fixe et que la mise en cache est importante.
  • GraphQL gagne lorsque plusieurs clients ont besoin de différentes tranches du même graphique de données.
  • gRPC gagne lorsque les services internes communiquent entre eux et que le débit compte plus que la lisibilité humaine.

Voici la même logique que le code :

REST : la valeur par défaut universelle

REST mappe les opérations aux verbes HTTP et les ressources aux URL. Chaque langage de programmation possède un client HTTP. Chaque CDN comprend les en-têtes de cache. Chaque développeur a utilisé curl.

REST est le bon choix pour les API publiques où vous contrôlez la forme des données et où les clients attendent des données stables, points finaux documentés. Les plus de 150 points de terminaison d'API de Botoi utilisent tous REST. Voici une recherche DNS :

Réponse:

La requête est un seul POST. La réponse est un objet JSON plat. Vous pouvez le tester avec curl, le piper à travers jq, ou appelez-le depuis n'importe quelle langue avec fetch. Aucun fichier de schéma à compiler, aucun langage de requête à apprendre, aucune étape de génération de code.

Là où REST brille

  • API de développeur public. Les développeurs tiers attendent REST. Le coût d’intégration est nul.
  • Ressources pouvant être mises en cache. La mise en cache HTTP fonctionne à chaque couche : navigateur, CDN, proxy inverse. UN GET /users/123 une réponse avec des en-têtes de cache appropriés ne coûte rien en cas de demandes répétées.
  • Intégrations de webhooks. Les webhooks sont des requêtes HTTP POST. REST correspond au modèle mental.
  • Opérations CRUD simples. Lorsque chaque point de terminaison fait une chose avec une forme d’entrée et une forme de sortie, REST n’ajoute aucune surcharge.

Où REST échoue

  • Surcharge. Une application mobile qui nécessite 3 champs d'un profil utilisateur télécharge toujours l'objet complet de 40 champs.
  • Sous-récupération. Un tableau de bord qui montre un utilisateur, son équipe et son activité récente effectue 3 appels HTTP séquentiels. La latence s'additionne.
  • Aucune évolution de schéma intégrée. Vous versionnez les URL (/v1/, /v2/) ou ajoutez des champs et espérez que les clients ignoreront les clés inconnues.

GraphQL : requêtes pilotées par le client

GraphQL permet au client de spécifier exactement les champs dont il a besoin en une seule requête. Le serveur expose un schéma typé. Le client écrit une requête sur ce schéma et reçoit une réponse adaptée.

L'API publique de GitHub le démontre bien. Une requête récupère votre nom d'utilisateur et les 3 principaux référentiels avec le nombre d'étoiles et la langue principale. En REST, cela nécessiterait au moins 2 appels.

Réponse:

Le client a demandé name, stargazerCount, et primaryLanguage. Le serveur a renvoyé exactement ces champs. Aucune donnée supplémentaire transférée. Pas de deuxième demande.

Là où GraphQL brille

  • Applications mobiles. La bande passante est limitée. La taille de la charge utile est importante. GraphQL élimine la récupération excessive sur chaque écran.
  • Tableaux de bord et vues d'agrégation. Une seule requête peut extraire les données des utilisateurs, des commandes et de l'inventaire en un seul aller-retour.
  • Itération frontale rapide. Les équipes front-end modifient leurs requêtes sans attendre que les équipes back-end créent de nouveaux points de terminaison.
  • Frappe forte. Le schéma est le contrat. Les outils de génération de code comme GraphQL Code Generator en produisent des types TypeScript.

Là où GraphQL échoue

  • Mise en cache. Chaque requête est un POST à /graphql. La mise en cache HTTP au niveau du CDN ou du navigateur ne fonctionne pas sans une couche de requêtes persistantes ou des requêtes basées sur GET.
  • Surface de sécurité. Les clients peuvent écrire des requêtes coûteuses qui rejoignent des données profondément imbriquées. Vous avez besoin d’une analyse des coûts des requêtes et d’une limitation de la profondeur pour éviter les abus.
  • Courbe d'apprentissage. Les développeurs doivent apprendre le langage de requête, la conception de schémas, les résolveurs et les modèles DataLoader. Le temps de montée en puissance est supérieur à REST.
  • Requêtes N+1. Les modèles de résolution naïfs déclenchent une requête de base de données par élément d'une liste. Le traitement par lots DataLoader résout ce problème, mais vous devez le créer vous-même.

gRPC : vitesse interne

gRPC utilise des tampons de protocole pour la sérialisation et HTTP/2 pour le transport. Vous définissez votre service contrat dans un .proto fichier, générer du code client et serveur et obtenir des appels RPC de type sécurisé avec des charges utiles binaires.

De cette définition, protoc génère des stubs clients et des interfaces serveur en Go, Java, Python, Rust, C++ ou une douzaine d'autres langages. Le code généré gère la sérialisation, la désérialisation, et le cadrage HTTP/2.

Là où gRPC brille

  • Communication de service à service. Les microservices internes qui échangent des messages à haute fréquence bénéficient de la sérialisation binaire et des flux multiplexés.
  • Des contrats stricts. La .proto Le fichier est la seule source de vérité. Les modifications avec rupture sont détectées au moment de la compilation, pas au moment de l'exécution.
  • Diffusion bidirectionnelle. gRPC prend en charge le streaming serveur, le streaming client et le streaming bidirectionnel. Les fonctionnalités en temps réel telles que les flux de transactions en direct s'intègrent naturellement.
  • Environnements polyglottes. Un service Go peut appeler un service Python via des stubs générés sans code de sérialisation manuelle.

Là où gRPC échoue

  • Prise en charge du navigateur. Les navigateurs ne peuvent pas effectuer d'appels gRPC natifs. Le proxy grpc-web ajoute une couche de complexité et de latence.
  • Lisibilité humaine. Les charges utiles binaires ne sont pas inspectables avec curl ou des outils de développement de navigateur. Le débogage nécessite des outils spécialisés comme grpcurl ou Bloom RPC.
  • Maturité de l'écosystème. REST dispose de plusieurs décennies d'outils : Postman, Swagger, passerelles API, limiteurs de débit. Les outils gRPC se développent mais pas au même niveau.
  • Courbe d'apprentissage. Les équipes doivent apprendre les tampons de protocole, la syntaxe proto3, les pipelines de génération de code et les modèles de gestion des erreurs spécifiques à gRPC.

Tableau comparatif

Critères REPOS GraphQL gRPC
Transport HTTP/1.1 ou HTTP/2 HTTP/1.1 ou HTTP/2 HTTP/2 (obligatoire)
Sérialisation JSON (texte) JSON (texte) Tampons de protocole (binaire)
Latence (typique) 50-200 ms 50-300 ms 10-50 ms
Mise en cache HTTP Natif (GET + en-têtes de cache) Nécessite des requêtes persistantes Sans objet
Prise en charge du navigateur Complète Complète Via le proxy grpc-web uniquement
Streaming SSE, WebSockets (séparés) Abonnements (séparés) Intégré (4 modes)
Calendrier/contrat OpenAPI (facultatif) GraphQL SDL (obligatoire) Fichiers .proto (obligatoires)
Génération de code Facultatif (générateur openapi) Commun (graphql-codegen) Obligatoire (protocole)
Courbe d'apprentissage Faible Moyen Haut
Débogage curl, navigateur, facteur GraphiQL, Altaïr, Facteur grpcurl, Bloom RPC
Cas d'utilisation principal API publiques, CRUD Requêtes pilotées par le client Microservices internes

Exemples de décisions concrètes

Stripe : REST pour les paiements

Stripe traite des milliards de dollars de paiements via une API REST. Leurs points finaux sont prévisibles modèles: POST /v1/payment_intents, GET /v1/charges/:id. Chaque développeur qui intègre Stripe connaît HTTP. La friction d’intégration est proche de zéro. Stripe a choisi REST parce que leur public est constitué de développeurs externes qui ont besoin de points de terminaison stables, documentés et pouvant être mis en cache.

GitHub : GraphQL pour les outils de développement

GitHub a migré de REST (v3) vers GraphQL (v4) car leurs clients (applications de bureau, applications mobiles, intégrations tierces) nécessitaient toutes des données différentes provenant des mêmes objets. Un outil CI doit être validé statut et vérifications. Une application de gestion de projet a besoin de problèmes, d'étiquettes et de responsables. Une application mobile nécessite une vue de profil minimale. Un point de terminaison REST ne pourrait pas servir les trois sans une récupération excessive massive.

Google : gRPC pour les services internes

Google a créé gRPC (le « g » représente un mot différent à chaque version) pour gérer le service à service interne. communication à grande échelle. Lorsque votre maillage de services traite des millions de RPC par seconde, la différence entre l'analyse de texte JSON et la désérialisation binaire de Protocol Buffer. Google a choisi gRPC parce que le public est interne, les contrats sont stricts et le débit est la principale contrainte.

Pourquoi Botoi a choisi REST pour plus de 150 points de terminaison

L'API de botoi sert des points de terminaison d'utilitaires indépendants : recherches DNS, validation d'e-mails, formatage JSON, code QR génération, calcul de hachage. Chaque point de terminaison prend une entrée spécifique et renvoie une sortie spécifique. Il n'existe pas de graphique de données relationnelles reliant un enregistrement DNS à un code QR.

Trois facteurs ont fait de REST le choix évident :

  • Support client universel. Les développeurs appellent botoi depuis Node.js, Python, Go, Ruby, PHP, des scripts shell et des agents IA. REST fonctionne dans chacun d'eux sans aucune configuration.
  • Mise en cache. OBTENIR des points de terminaison pour les ressources statiques (telles que les recherches de pays ou les listes de devises) bénéficiez de la mise en cache HTTP au niveau de la couche CDN. Cela maintient les temps de réponse sous 20 ms pour les demandes répétées.
  • Découvrabilité. Chaque point de terminaison possède une URL stable, une entrée de spécification OpenAPI et un documents via Scalar. Les nouveaux développeurs trouvent et testent les points de terminaison en moins d'une minute.

GraphQL ajouterait de la complexité sans avantage. Il n’y a pas de graphique de requête à parcourir. gRPC serait exclure les clients de navigateur et les scripts shell. REST est le bon outil pour cette forme de problème.

Mélanger les protocoles dans un seul système

Le cadre s’applique par frontière et non par organisation. De nombreux systèmes de production combinent des protocoles :

  • Couche API externe : REPOS. Les développeurs tiers et les webhooks attendent HTTP + JSON.
  • Passerelle côté client : GraphQL. Les clients mobiles et Web interrogent une passerelle qui regroupe les données de plusieurs services.
  • Maillage de services interne : gRPC. Les services backend communiquent avec des charges utiles binaires et des contrats stricts.

Il ne s’agit pas de complexité pour la complexité. Chaque frontière a un public différent avec des contraintes. Le protocole doit correspondre à la contrainte, et non l'inverse.

Liste de contrôle de décision

Copiez ceci dans votre document de conception. Répondez à chaque question et le choix du protocole devient évident.

  1. Qui sont les consommateurs d’API ? Développeurs externes (REST), votre propre équipe frontend (GraphQL), services internes (gRPC).
  2. Combien de formes de données les clients demandent-ils ? Une forme (REST), plusieurs formes (GraphQL), des contrats fixes (gRPC).
  3. La mise en cache HTTP est-elle importante ? Oui (REST), parfois (GraphQL avec effort), non (gRPC).
  4. Avez-vous besoin de streaming ? Non (REST convient), abonnements (GraphQL), bidirectionnel (gRPC).
  5. Quelles langues les clients utilisent-ils ? Tout (REST), lourd en JS/TS (les outils GraphQL sont les plus puissants ici), polyglotte avec génération de code (gRPC).
  6. Quelle est l’expertise actuelle de l’équipe ? Si personne ne connaît les tampons de protocole, gRPC a un coût de montée en puissance élevé. Si personne ne connaît les résolveurs GraphQL, attendez-vous à un mois d'apprentissage avant la mise en production.

Si vous avez répondu « développeurs externes » à la question 1, arrêtez-vous ici. Utilisez REPOS. Les autres questions ne deviennent pertinents que lorsque le public est interne ou lorsque vous contrôlez à la fois le client et le serveur.

Erreurs courantes à éviter

  • Choisir GraphQL parce que cela semble nouveau. GraphQL ajoute la complexité du résolveur, la requête analyse des coûts et atténuation N+1. Si votre API possède 10 points de terminaison CRUD avec des formes fixes, REST le fait le même travail avec moins de code.
  • Choisir gRPC pour une API publique. Vos utilisateurs ne peuvent pas appeler gRPC depuis un navigateur, depuis curl, ou à partir d’un outil low-code. De toute façon, vous finirez par construire une passerelle REST devant.
  • Choisir REST pour un graphique de données complexe. Si votre équipe frontend demande 5 nouveaux des points de terminaison « récapitulatifs » par sprint car ceux existants renvoient trop ou pas assez de données, c'est un signe que GraphQL réduirait les frais de coordination.
  • Ignorer l’expertise de l’équipe. Le protocole le plus rapide à expédier est celui de votre équipe sait déjà. Une équipe maîtrisant REST qui passe à gRPC passera des semaines sur les outils avant écrire une logique métier.

FAQ

Quand dois-je choisir GraphQL plutôt que REST ?
Choisissez GraphQL lorsque vos clients ont besoin de demander différentes formes de données au même backend. Les applications mobiles qui doivent minimiser la taille de la charge utile et les tableaux de bord qui regroupent les données de plusieurs objets de domaine bénéficient tous deux des requêtes pilotées par le client. Si chaque client envoie la même requête, REST est plus simple.
gRPC est-il plus rapide que REST ?
gRPC utilise le multiplexage HTTP/2 et la sérialisation binaire des tampons de protocole, il transfère donc des charges utiles plus petites avec une latence inférieure à celle de JSON sur HTTP/1.1. Dans les benchmarks, gRPC traite généralement 2 à 10 fois plus de requêtes par seconde que les points de terminaison REST équivalents. L'écart se réduit lorsque REST fonctionne également sur HTTP/2 avec un format compact comme MessagePack.
Puis-je utiliser gRPC dans un navigateur ?
Pas directement. Les navigateurs n'exposent pas le cadrage HTTP/2 requis par gRPC. grpc-web est une couche proxy qui assure la traduction entre le navigateur et un backend gRPC, mais elle ajoute de la latence et une surcharge opérationnelle. Pour les clients navigateurs, REST ou GraphQL restent les choix pratiques.
Pourquoi Botoi utilise-t-il REST au lieu de GraphQL ?
botoi dessert plus de 150 points de terminaison d'utilitaires indépendants, chacun avec une forme de requête unique et une forme de réponse unique. Il n'y a pas de graphique de données relationnelles à parcourir. REST donne à chaque point de terminaison une URL stable et pouvant être mise en cache. Les développeurs peuvent tester n'importe quel point de terminaison avec une seule commande curl et aucun langage de requête à apprendre.
Puis-je combiner REST, GraphQL et gRPC dans un seul système ?
Oui. De nombreuses équipes exécutent gRPC entre les microservices internes pour plus de rapidité, exposent une passerelle GraphQL pour les clients mobiles et Web et conservent REST pour les intégrations publiques et les webhooks. Le cadre décisionnel s’applique par frontière et non par organisation.

Commencez a construire avec botoi

150+ endpoints API pour la recherche, le traitement de texte, la generation d'images et les utilitaires pour developpeurs. Offre gratuite, sans carte bancaire.