GraphQL en C++ : cppgraphqlgen — un outil puissant pour les API modernes
GraphQL est un langage de requête pour les API qui permet aux clients de recevoir uniquement les données nécessaires. Bien que GraphQL soit le plus souvent associé à JavaScript (Apollo, Relay) ou Python (Graphene, Strawberry), il existe également une excellente solution pour les systèmes à forte charge en C++ — la bibliothèque cppgraphqlgen. Elle fournit un ensemble complet d'outils pour créer une partie serveur GraphQL en C++ pur avec le support des normes modernes C++17/20.
Qu'est-ce que cppgraphqlgen ?
cppgraphqlgen est une bibliothèque header-only (avec compilation optionnelle en .so/.dll) qui implémente la spécification GraphQL (Juin 2018). Elle génère du code type-safe basé sur le schéma (SDL — Schema Definition Language) et permet de créer des serveurs GraphQL efficaces et multithreadés.
Fonctionnalités clés :
- Génération de code à partir du schéma — vous décrivez les types, requêtes et mutations dans un fichier
.graphql, et l'utilitairegraphqlgencrée des classes C++. - Type-safety — tous les types sont vérifiés à la compilation. Aucune erreur de type à l'exécution.
- Performance — surcharge minimale, support des résolveurs asynchrones (via
std::future). - Support des abonnements (Subscriptions) — via WebSocket ou gRPC.
- Intégration avec n'importe quel serveur HTTP — peut être utilisé avec
crow,drogon,beast(Boost.Asio) ou même votre propre implémentation.
Architecture de la bibliothèque
cppgraphqlgen se compose de deux parties :
- Générateur de code (
graphqlgen) — lit le schéma et crée des fichiers d'en-tête avec des classes pour chaque type, des interfaces pour les résolveurs et des fonctions auxiliaires. - Bibliothèque runtime — analyseur de requêtes, validateur, exécuteur et sérialiseur de réponses.
Installation
La bibliothèque est distribuée via vcpkg ou compilée à partir des sources :
git clone https://github.com/microsoft/cppgraphqlgen.gitcd cppgraphqlgenmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasecmake --build . --target installPour utiliser le générateur, node.js est nécessaire (il est écrit en TypeScript), mais le runtime est en C++ pur.
Exemple : création d'un serveur GraphQL simple
Créons d'abord le schéma schema.graphql :
type Query { hello: String user(id: Int!): User}
type User { id: Int name: String email: String}Ensuite, exécutons le générateur :
graphqlgen --schema schema.graphql --output ./generatedAprès cela, les fichiers suivants apparaîtront dans le dossier generated : SchemaTypes.h, SchemaResolver.h et autres. Écrivons maintenant les résolveurs :
#include "generated/SchemaTypes.h"#include "generated/SchemaResolver.h"
class QueryResolver : public graphql::schema::Query::Resolver {public: std::shared_ptr<graphql::schema::String> getHello() override { return std::make_shared<graphql::schema::String>("Bonjour, GraphQL depuis C++ !"); }
std::shared_ptr<graphql::schema::User> getUser(int id) override { auto user = std::make_shared<graphql::schema::User>(); user->id = std::make_shared<graphql::schema::Int>(id); user->name = std::make_shared<graphql::schema::String>("Jean Dupont"); user->email = std::make_shared<graphql::schema::String>("jean@exemple.com"); return user; }};Maintenant, assemblons le serveur en utilisant crow :
#include <crow.h>#include "generated/Schema.h"