GraphQL en C++ : bibliothèque cppgraphqlgen pour créer des API

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

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, beast de 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 install


Exemple 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 :


                
    
    

Recommendations