GraphQL vs REST en C++ : choisir l'API idéale pour les systèmes à haute charge
\n\nLe débat entre REST et GraphQL agite tous les langages de programmation. Mais quand il s'agit du C++ — un langage où chaque octet et chaque microseconde comptent — la discussion prend une dimension particulière. Beaucoup pensent que le C++ est réservé aux pilotes bas niveau et aux moteurs de jeux, et que les API web s'écrivent en Python, Go ou Rust. Pourtant, c'est loin d'être le cas. Le C++ est utilisé pour créer des backends à forte charge, des microservices pour les systèmes financiers et des plateformes IoT où la vitesse est cruciale.
\n\nDans cet article, nous analysons ce qui convient le mieux aux projets C++ : le REST classique ou le GraphQL moderne. Pas de blabla — uniquement du code C++ concret, des benchmarks et des conseils pratiques.
\n\nREST en C++ : un classique qui fonctionne
\n\nREST est un style d'architecture, pas un protocole. En C++, il est implémenté via des serveurs HTTP. Les bibliothèques les plus populaires sont CrowCpp, Drogon et Pistache. Elles sont légères, rapides et permettent de monter une API rapidement.
\n\nVoici à quoi ressemble un point d'accès REST simple en C++ avec CrowCpp :
\n\n#include "crow.h"\n\nstruct User {\n int id;\n std::string name;\n std::string email;\n};\n\nint main() {\n crow::SimpleApp app;\n\n CROW_ROUTE(app, "/user/<int>")\n ([](int user_id) {\n // Simulation d'une requête à la base de données\n User user{user_id, "Alice", "alice@example.com"};\n \n crow::json::wvalue x;\n x["id"] = user.id;\n x["name"] = user.name;\n x["email"] = user.email;\n return x;\n });\n\n app.port(8080).multithreaded().run();\n}\n\n\nLes avantages du REST en C++ sont évidents : surcharge minimale, méthodes HTTP prévisibles (GET, POST, PUT, DELETE) et une multitude d'outils prêts à l'emploi. Vous écrivez une fonction, vous l'associez à une URL, et le tour est joué. Pour les opérations CRUD simples, REST reste le roi.
\n\nMais il y a aussi des inconvénients. Dans les projets réels, on rencontre souvent le problème du sur-chargement (récupération de données inutiles) et du sous-chargement (nécessité d'effectuer plusieurs requêtes). Par exemple, pour obtenir un utilisateur et ses dernières commandes, vous devez faire deux requêtes : /user/1 et /orders?user_id=1. En C++, cela se résout, mais au prix de l'écriture de code supplémentaire côté backend.
GraphQL en C++ : flexibilité avec typage
\n\nGraphQL est un langage de requêtes qui permet au client de demander uniquement ce dont il a besoin. Pour le C++, il existe des bibliothèques matures : cppgraphqlgen (de Microsoft), taoPQ et Drogon GraphQL. Elles génèrent du code C++ à partir d'un schéma GraphQL, offrant un typage strict dès la compilation.
\n\nVoici un exemple de résolveur GraphQL en C++ avec cppgraphqlgen :
#include "graphqlservice/GraphQLService.h"\n#include "UserSchema.h" // généré à partir de schema.graphql\n\nclass UserResolver : public graphql::User::Object {\npublic:\n std::shared_ptr<graphql::User::User> getUser(int32_t id) override {\n auto user = std::make_shared<graphql::User::User>();\n user->getId() = id;\n user->getName() = "Alice";\n user->getEmail() = "alice@example.com";\n return user;\n }\n};\n\nint main() {\n auto service = std::make_shared<graphql::User::Service>(std::make_shared<UserResolver>());\n // Lancement du serveur HTTP (par exemple, via Crow)\n}\n\n\nLe principal avantage de GraphQL en C++ est la sécurité de typage. Si vous modifiez le schéma, le compilateur vous indique immédiatement tous les endroits où les résolveurs doivent être mis à jour. Fini les erreurs d'exécution avec des "champs inattendus". Pour les projets dont le modèle de données change fréquemment, cela permet d'économiser des heures de débogage.
\n\nCependant, la flexibilité a un prix. Les requêtes GraphQL sont analysées et validées côté serveur, ce qui ajoute une surcharge CPU. En C++, cela est moins critique qu'en Python, mais pour les systèmes gérant des millions de requêtes, cela peut devenir un facteur à prendre en compte.