GraphQL en C++ : la bibliothèque cppgraphqlgen pour les API modernes

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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'utilitaire graphqlgen cré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 :

  1. 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.
  2. 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 install


Pour 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 ./generated


Aprè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"

Recommendations