Les 7 familles d'API, sans l'amalgame
REST, SOAP, gRPC, GraphQL, Webhooks, WebSockets, WebRTC. Sept manières de faire communiquer deux machines. Aucune n'est meilleure que les autres : chacune répond à un problème précis. Voici la grille de lecture.
D'abord, c'est quoi une API ?
API — Application Programming Interface. Un contrat technique qui permet à un programme d'en utiliser un autre, sans connaître ses détails internes. La nature du contrat varie : une bibliothèque appelée en mémoire, un service local exposé sur une socket, ou — le cas qui nous intéresse ici — un système distant accessible via le réseau.
Tout ce qui suit concerne donc les API réseau : deux machines distinctes qui s'échangent des données ou déclenchent des opérations à distance, à travers un protocole défini. Et c'est justement le choix de ce protocole qui ouvre les sept familles ci-dessous.
Trois axes pour s'orienter
L'erreur la plus fréquente, c'est de comparer ces protocoles sur leur popularité ou leur âge. Une API n'est pas un produit : c'est une réponse à un problème de communication. Avant de regarder les sept familles, il faut poser les axes qui les séparent vraiment.
Serveur pousse
Les deux en duplex
Persistant (connexion ouverte)
Streaming (flux continu)
Binaire (Protobuf)
Media (audio/vidéo)
Avec ces trois axes en tête, on cesse de voir « sept protocoles concurrents » pour voir « sept points dans un espace ». GraphQL et REST sont proches voisins. WebRTC vit dans une autre galaxie. C'est pour ça qu'on ne les remplace pas l'un par l'autre.
REST, le standard de facto
REST n'est pas un protocole, c'est un style architectural posé par Roy Fielding dans sa thèse. L'idée centrale : tout est une ressource identifiée par une URL, manipulée via les verbes HTTP standards (GET, POST, PUT, DELETE). Chaque requête est stateless au sens où le serveur ne garde aucun contexte de session entre deux appels — l'état des ressources reste évidemment côté serveur, c'est la conversation client-serveur qui est sans mémoire.
requête → réponse, sans état partagé
- Universellement supporté, cacheable nativement
- Conventions claires, courbe d'apprentissage douce
- Outillage abondant (curl, Postman, navigateurs)
- Over-fetching et under-fetching fréquents
- Pas de streaming natif, pas de push serveur
- Versioning des contrats parfois douloureux
Mon angle d'ingénieur : dans une app SaaS B2B greenfield, je commence presque toujours par REST. Le coût d'entrée est nul, l'outillage suit, et le jour où une portion du trafic exige réellement du streaming ou de l'agrégation côté client, on ajoute la techno qui répond — gRPC sur un sous-chemin interne, GraphQL sur un BFF — sans tout réécrire.
SOAP, le vétéran de l'entreprise
SOAP (Simple Object Access Protocol) est un protocole strict basé sur XML, doté d'un contrat formel (le WSDL) qui décrit chaque opération et chaque type de données. C'est l'ancêtre des API modernes — souvent moqué pour sa verbosité, mais toujours en place dans la banque, l'assurance, la défense, et tout ce qui demande des transactions ACID inter-systèmes.
enveloppe XML lourde, contrat WSDL strict
- Contrats stricts via WSDL, génération de clients
- Sécurité robuste (WS-Security, signatures XML)
- Support natif des transactions distribuées
- Verbosité XML énorme (overhead réseau et CPU)
- Outillage moderne plus rare, courbe raide
- Mal adapté au web mobile et aux navigateurs
gRPC, la performance pour le back-to-back
gRPC est le framework RPC moderne issu de Google. Il combine trois choix techniques : Protocol Buffers comme format binaire compact, HTTP/2 comme transport (multiplexage, push, compression d'en-têtes), et la génération de code à partir d'un fichier .proto dans la plupart des langages. Résultat : des appels typés, rapides, qui supportent le streaming dans les deux sens.
frames binaires multiplexés sur HTTP/2, streaming bidirectionnel
- Payload 5 à 10× plus compact que JSON
- Streaming bidirectionnel natif
- Génération de clients typés multi-langages
- Support navigateur partiel (passe par gRPC-Web)
- Debug binaire moins direct que JSON
- Exige HTTP/2 de bout en bout
Mon angle d'ingénieur : gRPC seulement quand l'organisation sait opérer Protobuf — codegen intégré au CI, breaking changes versionnés discipline-de-fer, outillage de debug binaire en place. Sans ça, on récupère la performance et on perd la productivité.
GraphQL, le client décide ce qu'il veut
GraphQL (Facebook, 2015) inverse le contrôle de la donnée. Plutôt qu'une liste figée d'endpoints, le serveur publie un schéma typé, et le client interroge ce schéma en décrivant exactement les champs dont il a besoin, le tout en une seule requête. Fini les GET /user, puis GET /user/posts, puis GET /user/posts/comments : tout tient en une expression déclarative.
une requête déclarative, une réponse de forme identique
- Plus d'over-fetching, une seule requête réseau
- Schéma typé, introspection, outillage riche
- Évolution sans versioning de l'API
- Caching HTTP nettement moins naturel qu'en REST, exige une stratégie dédiée (persisted queries, Apollo Cache, etc.)
- Problème du N+1 côté résolveurs
- Complexité backend, risque de requêtes coûteuses
Mon angle d'ingénieur : souvent overkill pour une seule appli web. La valeur de GraphQL apparaît quand plusieurs frontends différents tapent le même backend — sinon, on paie la complexité serveur sans en récolter les bénéfices.
Webhooks, l'API inversée
Un webhook n'est pas une API qu'on appelle, c'est une API qui appelle. Le principe : fournir une URL à un service tiers ; quand un événement survient chez lui (un paiement réussi, un commit poussé, un message reçu), il envoie une requête HTTP vers cette URL. C'est l'antidote au polling : plutôt que de demander toutes les cinq secondes « du nouveau ? », le système est notifié au moment où l'événement se produit.
le serveur déclenche, votre endpoint reçoit
- Quasi temps réel sans polling
- Découplage propre entre producteur et consommateur
- Économise une énorme charge serveur
- Endpoint public requis (NAT, firewall, tunnel)
- Signature obligatoire (HMAC) sinon falsifiable
- Retries et idempotence à la charge du consommateur
WebSockets, le tunnel bidirectionnel
WebSocket ouvre une connexion TCP persistante et bidirectionnelle entre client et serveur, après un handshake HTTP initial qui « upgrade » la connexion. Une fois établie, les deux côtés peuvent émettre des messages à tout moment, sans nouveau cycle requête-réponse. C'est ce qui permet le chat temps réel, les flux de marché, l'édition collaborative.
une connexion ouverte, du trafic libre dans les deux sens
- Latence très faible, pas de re-handshake
- Le serveur peut pousser à tout moment
- Support navigateur natif depuis longtemps
- Connexions stateful : scaling horizontal complexe
- Reconnexion à gérer côté client
- Proxies et load balancers parfois récalcitrants
WebRTC, le pair-à-pair temps réel
WebRTC permet à deux navigateurs (ou applications) d'établir une connexion directe de pair à pair dans le cas idéal. Le serveur intervient pour la phase de signaling — échanger les descriptions de session (SDP) — et pour la traversée NAT (STUN, puis TURN si STUN échoue). En conditions réelles, TURN relaie souvent le trafic quand le NAT bloque la connexion directe, et toute visio à plus de deux participants passe en pratique par un SFU (Selective Forwarding Unit) côté serveur. Le « pur P2P » est un cas limite, pas la règle.
phase 1 — signaling SDP, phase 2 — flux direct entre pairs
- Latence ultra-faible (~100ms perçue)
- P2P quand il s'établit : économise la bande passante serveur
- Chiffrement end-to-end imposé par la spec
- Complexité du signaling, STUN, TURN à opérer
- P2P pur ne scale pas au-delà de quelques pairs (SFU)
- Debug et observabilité difficiles
Mon angle d'ingénieur : le « P2P gratuit » est un mirage en production. Sitôt qu'il faut TURN provisionné, un SFU dimensionné pour les calls à plus de deux, et une équipe pour observer la WebRTC stack, le coût opérationnel approche celui d'un serveur de streaming classique. C'est rarement le choix par défaut — c'est celui de la latence ultra-faible imposée.
La matrice de décision
Tout ramener à une question pratique : qu'est-ce que je veux faire ?
| Si l'objectif est… | Le bon choix | Pourquoi |
|---|---|---|
| Exposer une API publique | REST | Universel, cacheable, attendu par les intégrateurs |
| Communiquer entre microservices internes | gRPC | Compact, typé, streaming, multi-langages |
| Servir un frontend mobile + web complexe | GraphQL | Évite l'over-fetching, une requête par écran |
| Réagir à des événements externes | Webhooks | Pas de polling, découplage propre |
| Chat, notifications, dashboards live | WebSockets | Bidirectionnel persistant, faible latence |
| Audio / vidéo / data en temps réel | WebRTC | Pair-à-pair, latence minimale, media-natif |
| S'intégrer à un système bancaire legacy | SOAP | Contrats stricts, sécurité éprouvée, déjà en place |
Si tu dois décider demain
Trois questions, dans cet ordre
1 · Qui appelle qui ? Client → serveur, c'est REST/GraphQL/gRPC. Serveur → client, c'est Webhooks. Les deux à tout moment, c'est WebSockets ou WebRTC.
2 · Une réponse, ou un flux ? Une réponse, défaut REST. Un flux media, défaut WebRTC. Un flux de messages, défaut WebSockets.
3 · Qui consomme ? Un navigateur ouvert → REST/GraphQL/WebSockets. Du back-to-back interne polyglotte → gRPC. Un système bancaire → SOAP, parce qu'il est déjà là.
Pour 80% des cas, on s'arrête à la question 1. Le choix par défaut reste REST + Webhooks. Tout le reste est un cas spécifique qui doit justifier son surcoût d'opération.
REST pour le web ouvert, gRPC pour le back-to-back interne, GraphQL pour les frontends gourmands, Webhooks pour réagir, WebSockets pour dialoguer, WebRTC pour le temps réel media, SOAP pour le legacy d'entreprise. Aucune n'est obsolète : chacune répond à un problème spécifique.