TL;DR
Utilisez REST pour les API publiques et les opérations CRUD simples. Utilisez GraphQL lorsque les clients ont besoin d'une récupération de données flexible et que vous souhaitez réduire le sur-téléchargement. Utilisez gRPC pour la communication de microservices à haute performance. Modern PetstoreAPI implémente les trois protocoles, vous permettant de choisir le bon outil pour chaque cas d'utilisation.
Introduction
Vous construisez une API. Devriez-vous utiliser REST, GraphQL ou gRPC ? Chaque protocole a des défenseurs passionnés qui affirment que le leur est le meilleur. La vérité : ils sont tous bons à différentes choses.
REST est universel et simple. GraphQL donne aux clients le contrôle sur la récupération des données. gRPC est rapide et efficace pour les services internes. Le meilleur choix dépend de votre cas d'utilisation, pas du protocole qui est « meilleur ».
La plupart des API choisissent un protocole et s'y tiennent. Modern PetstoreAPI adopte une approche différente : elle implémente REST, GraphQL et gRPC, montrant comment la même API de magasin d'animaux fonctionne à travers les trois protocoles.
Dans ce guide, vous apprendrez les forces et les faiblesses de chaque protocole, verrez des exemples concrets de Modern PetstoreAPI, et découvrirez comment choisir le protocole adapté à vos besoins.
REST : La norme universelle
REST (Representational State Transfer) est le protocole API le plus courant.
Comment fonctionne REST
Les ressources sont accédées via des URL avec des méthodes HTTP :
GET /pets - Lister les animaux
POST /pets - Créer un animal
GET /pets/{id} - Obtenir un animal
PUT /pets/{id} - Mettre à jour un animal
DELETE /pets/{id} - Supprimer un animal
Exemple de requête :
GET https://petstoreapi.com/v1/pets/019b4132-70aa-764f-b315-e2803d882a24
Exemple de réponse :
{
"id": "019b4132-70aa-764f-b315-e2803d882a24",
"name": "Fluffy",
"species": "CAT",
"status": "AVAILABLE",
"price": 299.99
}
Forces de REST
1. Compatibilité universelle
Chaque langage de programmation possède des bibliothèques HTTP. Navigateurs, curl, Postman—tout fonctionne avec REST.
2. Simple à comprendre
Les URL représentent les ressources. Les méthodes HTTP représentent les actions. Le modèle mental est simple.
3. Cacheable
La mise en cache HTTP fonctionne nativement. Les requêtes GET peuvent être mises en cache par les navigateurs, les CDN et les proxys.
4. Sans état
Chaque requête est indépendante. Pas d'état de session sur le serveur.
5. Excellents outils
Spécifications OpenAPI, Swagger UI, outils de test d'API—REST dispose du meilleur écosystème.
Faiblesses de REST
1. Sur-récupération
Vous obtenez tous les champs même si vous n'en avez besoin que d'un seul :
// Vous n'avez besoin que du nom, mais vous obtenez tout
{
"id": "019b4132-70aa-764f-b315-e2803d882a24",
"name": "Fluffy",
"species": "CAT",
"status": "AVAILABLE",
"price": 299.99,
"description": "...",
"images": [...],
"vaccinations": [...]
}
2. Sous-récupération (problème N+1)
Pour obtenir un animal et ses commandes, vous avez besoin de plusieurs requêtes :
GET /pets/123 # Obtenir un animal
GET /pets/123/orders # Obtenir les commandes
GET /orders/456/items # Obtenir les articles de la commande
3. Complexité du versioning
Les changements incompatibles nécessitent de nouvelles versions d'API (/v1, /v2).
4. Pas de mises à jour en temps réel
REST est basé sur le modèle requête-réponse. Pour les données en temps réel, vous avez besoin de sondage (polling) ou de WebSockets.
Quand utiliser REST
- API publiques (compatibilité maximale)
- Opérations CRUD simples
- Lorsque la mise en cache est importante
- Lorsque vous avez besoin d'un large support d'outils
- Applications mobiles avec des besoins en données prévisibles
Implémentation REST de Modern PetstoreAPI
GraphQL : Récupération de données flexible
GraphQL permet aux clients de spécifier exactement les données dont ils ont besoin.
Comment fonctionne GraphQL
Point d'accès unique avec un langage de requête :
query {
pet(id: "019b4132-70aa-764f-b315-e2803d882a24") {
name
species
orders {
id
total
items {
product
quantity
}
}
}
}
Réponse :
{
"data": {
"pet": {
"name": "Fluffy",
"species": "CAT",
"orders": [
{
"id": "order-123",
"total": 49.99,
"items": [
{"product": "Cat food", "quantity": 2}
]
}
]
}
}
}
Forces de GraphQL
1. Pas de sur-récupération
Les clients ne demandent que les champs dont ils ont besoin :
query {
pet(id: "019b4132-70aa-764f-b315-e2803d882a24") {
name # Obtenir seulement le nom
}
}
2. Pas de sous-récupération
Obtenir les données liées en une seule requête :
query {
pet(id: "019b4132-70aa-764f-b315-e2803d882a24") {
name
orders {
items {
product
}
}
}
}
Pas de problème N+1.
3. Typage fort
Les schémas GraphQL sont fortement typés. Les clients savent exactement ce qui est disponible.
4. Introspection
Les clients peuvent interroger le schéma pour découvrir les opérations disponibles :
query {
__schema {
types {
name
fields {
name
type
}
}
}
}
5. Point d'accès unique
Toutes les opérations passent par une seule URL : /graphql
Faiblesses de GraphQL
1. Complexité
GraphQL est plus difficile à apprendre que REST. Requêtes, mutations, abonnements, résolveurs—il y a plus à comprendre.
2. La mise en cache est plus difficile
La mise en cache HTTP ne fonctionne pas bien. Vous avez besoin de stratégies de mise en cache personnalisées.
3. Risque de sur-requête
Les clients peuvent écrire des requêtes coûteuses :
query {
pets {
orders {
items {
product {
reviews {
author {
pets {
# Profondeur infinie !
}
}
}
}
}
}
}
}
Vous avez besoin de limites de profondeur de requête et d'une analyse de complexité.
4. Le téléchargement de fichiers est délicat
GraphQL n'a pas été conçu pour le téléchargement de fichiers. Vous avez besoin de solutions de contournement.
5. La surveillance est plus difficile
Toutes les requêtes vont à /graphql. Vous ne pouvez pas surveiller par URL.
Quand utiliser GraphQL
- Applications mobiles (réduire la bande passante)
- Exigences de données complexes
- Lorsque les clients ont besoin de flexibilité
- API internes avec des clients connus
- Lorsque vous voulez éviter le versioning
Implémentation GraphQL de Modern PetstoreAPI
gRPC : RPC haute performance
gRPC utilise les Protocol Buffers pour une communication binaire efficace.
Comment fonctionne gRPC
Définissez les services dans des fichiers .proto :
service PetService {
rpc GetPet(GetPetRequest) returns (Pet);
rpc ListPets(ListPetsRequest) returns (ListPetsResponse);
rpc CreatePet(CreatePetRequest) returns (Pet);
}
message Pet {
string id = 1;
string name = 2;
string species = 3;
PetStatus status = 4;
}
Code client (généré) :
client := pb.NewPetServiceClient(conn)
pet, err := client.GetPet(ctx, &pb.GetPetRequest{
Id: "019b4132-70aa-764f-b315-e2803d882a24",
})
Forces de gRPC
1. Performance
Les Protocol Buffers sont plus petits et plus rapides que JSON :
- Payloads 3 à 10 fois plus petits
- Sérialisation 20 à 100 fois plus rapide
2. Streaming
Prise en charge intégrée du streaming serveur, du streaming client et du streaming bidirectionnel :
rpc WatchPets(WatchPetsRequest) returns (stream Pet);
3. Typage fort
Les Protocol Buffers imposent les types au moment de la compilation.
4. Génération de code
Générez du code client et serveur dans plus de 10 langages à partir de fichiers .proto.
5. HTTP/2
Multiplexage, compression d'en-têtes et push serveur.
Faiblesses de gRPC
1. Non compatible avec les navigateurs
Les navigateurs ne prennent pas en charge le streaming bidirectionnel HTTP/2. Vous avez besoin de grpc-web (une solution de contournement).
2. Non lisible par l'homme
Les Protocol Buffers sont binaires. Vous ne pouvez pas curl un point d'accès gRPC et lire la réponse.
3. Plus difficile à déboguer
Les protocoles binaires sont plus difficiles à inspecter que JSON.
4. Moins d'outils
Moins d'outils comparé à REST. Pas d'équivalent de Swagger UI.
5. Courbe d'apprentissage plus raide
Les Protocol Buffers, la génération de code et les concepts gRPC prennent du temps à apprendre.
Quand utiliser gRPC
- Communication de microservices
- Exigences de haute performance
- Streaming en temps réel
- API internes (non publiques)
- Environnements polyglottes (plusieurs langages)
Implémentation gRPC de Modern PetstoreAPI
Comparaison côte à côte
| Fonctionnalité | REST | GraphQL | gRPC |
|---|---|---|---|
| Protocole | HTTP/1.1 ou HTTP/2 | HTTP/1.1 ou HTTP/2 | HTTP/2 uniquement |
| Format de données | JSON (généralement) | JSON | Protocol Buffers (binaire) |
| Points d'accès | Multiples (/pets, /orders) |
Unique (/graphql) |
Méthodes de service |
| Sur-récupération | Courant | Rare | N/A (vous définissez les messages) |
| Sous-récupération | Courant (N+1) | Rare | N/A |
| Mise en cache | Excellent (HTTP) | Faible | Faible |
| Support navigateur | Excellent | Excellent | Faible (nécessite grpc-web) |
| Outillage | Excellent | Bon | Moyen |
| Courbe d'apprentissage | Facile | Moyenne | Difficile |
| Performance | Bonne | Bonne | Excellente |
| Streaming | Non (nécessite WebSocket) | Oui (abonnements) | Oui (natif) |
| Versioning | URL ou en-tête | Évolution du schéma | Évolution du Proto |
| Idéal pour | API publiques, CRUD | Clients flexibles | Microservices |
Comment Modern PetstoreAPI implémente les trois
Modern PetstoreAPI est unique : elle implémente la même API de magasin d'animaux en REST, GraphQL et gRPC.
Mêmes données, trois protocoles
Obtenir un animal par ID :
REST :
GET https://petstoreapi.com/v1/pets/019b4132-70aa-764f-b315-e2803d882a24
GraphQL :
query {
pet(id: "019b4132-70aa-764f-b315-e2803d882a24") {
id
name
species
}
}
gRPC :
pet, err := client.GetPet(ctx, &pb.GetPetRequest{
Id: "019b4132-70aa-764f-b315-e2803d882a24",
})
Les trois renvoient les mêmes données d'animal.
Pourquoi implémenter les trois ?
1. Apprendre par comparaison
Voyez comment les mêmes opérations fonctionnent dans différents protocoles.
2. Choisir le bon outil
Utilisez REST pour les points d'accès publics, GraphQL pour les applications mobiles, gRPC pour les services internes.
3. Chemin de migration
Commencez avec REST, ajoutez GraphQL ou gRPC plus tard sans tout réécrire.
4. Implémentation de référence
Modern PetstoreAPI présente des modèles prêts pour la production pour les trois protocoles.
Consultez le guide de comparaison des protocoles pour des exemples détaillés.
Tester les API multi-protocoles avec Apidog
Apidog prend en charge REST, GraphQL et gRPC dans un seul outil.
Tester REST
Importez la spécification OpenAPI et exécutez des tests automatisés :
pm.test("Le statut est 200", () => {
pm.response.to.have.status(200);
});
pm.test("L'animal a les champs requis", () => {
const pet = pm.response.json();
pm.expect(pet).to.have.property('id');
pm.expect(pet).to.have.property('name');
});
Tester GraphQL
Écrivez des requêtes GraphQL et validez les réponses :
query GetPet($id: ID!) {
pet(id: $id) {
id
name
species
}
}
Apidog valide par rapport au schéma GraphQL.
Tester gRPC
Importez les fichiers .proto et testez les services gRPC :
service: PetService
method: GetPet
request: { "id": "019b4132-70aa-764f-b315-e2803d882a24" }
Apidog génère des requêtes à partir des définitions Protocol Buffer.
Tests inter-protocoles
Testez que les trois protocoles renvoient des données cohérentes :
- Appelez le point d'accès REST
- Appelez la requête GraphQL
- Appelez la méthode gRPC
- Comparez les réponses
Apidog aide à garantir la cohérence de votre API multi-protocoles.
Choisir le bon protocole
Utilisez cet arbre de décision :
S'agit-il d'une API publique ?→ Oui : Utilisez REST (compatibilité maximale) → Non : Continuez
Avez-vous besoin de streaming en temps réel ?→ Oui : Utilisez gRPC ou WebSocket → Non : Continuez
Les clients ont-ils besoin d'une récupération de données flexible ?→ Oui : Utilisez GraphQL → Non : Continuez
La performance est-elle critique (microservices) ?→ Oui : Utilisez gRPC → Non : Utilisez REST (option la plus simple)
Exemples concrets
- Stripe : REST (API publique, simple, cacheable)
- GitHub : REST + GraphQL (REST pour le public, GraphQL pour les requêtes complexes)
- Google Cloud : gRPC + REST (gRPC pour la performance, REST pour la compatibilité)
- Netflix : GraphQL (les applications mobiles ont besoin de données flexibles)
- Uber : gRPC (communication de microservices)
Pouvez-vous utiliser plusieurs protocoles ?
Oui ! Modern PetstoreAPI montre comment. Modèles courants :
- REST pour l'API publique
- GraphQL pour les applications mobiles
- gRPC pour les microservices internes
Chaque protocole sert différents clients avec des besoins différents.
Conclusion
REST, GraphQL et gRPC ne sont pas des concurrents—ce sont des outils pour différents usages. REST est universel et simple. GraphQL donne le contrôle aux clients. gRPC est rapide et efficace.
Modern PetstoreAPI implémente les trois, montrant comment la même API fonctionne à travers les protocoles. Vous pouvez explorer la documentation REST, le schéma GraphQL et les fichiers proto gRPC pour voir des exemples prêts pour la production.
Utilisez Apidog pour tester les trois protocoles, comparer les implémentations et assurer la cohérence de votre API multi-protocoles.
Le meilleur protocole est celui qui résout votre problème spécifique. Modern PetstoreAPI vous donne les connaissances pour choisir judicieusement.
FAQ
Puis-je utiliser REST et GraphQL ensemble ?
Oui. De nombreuses API proposent les deux. Utilisez REST pour les opérations simples et GraphQL pour les requêtes complexes. GitHub le fait.
gRPC remplace-t-il REST ?
Non. gRPC est destiné aux microservices internes. REST reste la norme pour les API publiques en raison d'une meilleure compatibilité et de meilleurs outils.
Quel protocole est le plus rapide ?
gRPC est le plus rapide grâce aux Protocol Buffers et à HTTP/2. Mais pour la plupart des API, la différence n'a pas d'importance—la latence du réseau domine.
Devrais-je migrer de REST vers GraphQL ?
Seulement si vous rencontrez le problème de sur-récupération/sous-récupération. Ne migrez pas juste parce que GraphQL est à la mode.
Les navigateurs peuvent-ils utiliser gRPC ?
Pas directement. Vous avez besoin de grpc-web, ce qui ajoute de la complexité. Pour les clients navigateurs, utilisez REST ou GraphQL.
Comment Modern PetstoreAPI maintient-elle les trois protocoles synchronisés ?
Couche logique métier partagée. REST, GraphQL et gRPC sont des adaptateurs de protocole minces au-dessus de la même API de base.
Quel protocole les startups devraient-elles utiliser ?
Commencez avec REST. C'est simple, bien compris et il dispose d'excellents outils. Ajoutez GraphQL ou gRPC plus tard si vous en avez besoin.
Apidog prend-il en charge les trois protocoles ?
Oui. Apidog prend en charge REST (OpenAPI), GraphQL et gRPC dans un seul outil, facilitant le test des API multi-protocoles comme Modern PetstoreAPI.
