Bibliothèque GraphQL C++ : cppgraphqlgen
cppgraphqlgen est une bibliothèque moderne en C++ pour implémenter la partie serveur de GraphQL. Elle permet aux développeurs de créer des API typées, rapides et évolutives, en tirant parti des avantages du typage statique de C++. La bibliothèque génère du code à partir du schéma GraphQL (fichiers .graphql), ce qui minimise l'écriture manuelle des résolveurs et réduit les risques d'erreurs.
Fonctionnalités principales
- Génération de code à partir du schéma — en entrée, un fichier schema.graphql, en sortie, des classes et fonctions C++.
- Typage fort — tous les types GraphQL (String, Int, Float, Boolean, ID, Enum, Input, Object) sont compilés en types C++ correspondants.
- Prise en charge des souscriptions (Subscriptions) — implémentée via WebSocket et flux asynchrones.
- Validation des requêtes — vérification intégrée de la syntaxe et de la sémantique des requêtes GraphQL.
- Intégration HTTP — fonctionne avec n'importe quel serveur HTTP C++ (par exemple,
beastde Boost). - Prise en charge des directives — directives personnalisées pour étendre les fonctionnalités.
Installation
Pour installer cppgraphqlgen, un compilateur prenant en charge C++17 et le système de build CMake sont requis. Installation via vcpkg ou compilation à partir des sources :
# Via vcpkgvcpkg install cppgraphqlgen
# Compilation à partir du dépôtgit clone https://github.com/microsoft/cppgraphqlgen.gitcd cppgraphqlgenmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasecmake --build . --target installExemple d'utilisation
Considérons un exemple simple : créons un schéma GraphQL pour obtenir des informations sur un utilisateur et un livre. Définissons d'abord le schéma schema.graphql :
type Query { user(id: ID!): User book(id: ID!): Book}
type User { id: ID! name: String! email: String}
type Book { id: ID! title: String! author: String!}Après la génération du code (commande graphqlgen), nous obtenons le fichier Generated.h. Écrivons maintenant les résolveurs en C++ :
#include "Generated.h"#include <unordered_map>
// Exemple de données (dans un projet réel — base de données)std::unordered_map<std::string, User> users = { {"1", {"1", "Alice", "alice@example.com"}}, {"2", {"2", "Bob", nullptr}}};
std::unordered_map<std::string, Book> books = { {"10", {"10", "C++ Primer", "Lippman"}}, {"20", {"20", "Effective Modern C++", "Meyers"}}};
// Résolveur pour Query.userUser resolveGetUser(const std::string& id) { auto it = users.find(id); if (it != users.end()) { return it->second; } throw std::runtime_error("User not found");}
// Résolveur pour Query.bookBook resolveGetBook(const std::string& id) { auto it = books.find(id); if (it != books.end()) { return it->second; } throw std::runtime_error("Book not found");}Configurons maintenant le serveur et lançons le traitement des requêtes :
#include <graphqlservice/GraphQLService.h>#include <beast/http.hpp>
int main() { // Création du service avec le schéma auto service = std::make_shared<graphql::service::GraphQLService>();
// Enregistrement des résolveurs service->addResolver("Query", "user", resolveGetUser); service->addResolver("Query", "book", resolveGetBook);
// Démarrage du serveur HTTP (simplifié) http::server server("0.0.0.0", 8080, service); server.run();
return 0;}Gestion des erreurs et validation
La bibliothèque vérifie automatiquement la validité des requêtes entrantes. Si un résolveur lève une exception, cppgraphqlgen la convertit en erreur GraphQL avec le code correspondant. Exemple de gestion :
Aussi dans la bibliothèque
Travailler avec CSV en Kotlin : bibliothèques et exemples de code
GraphQL en Go : Guide complet de la bibliothèque gqlgen
Bibliothèque GraphQL TypeScript : guide complet des outils
Journalisation pour C# (.NET) : meilleures solutions et bibliothèques
ts-mockito TypeScript : guide complet avec exemples pratiques
Recommendations