API GraphQL avec C++ : tutoriel pas à pas
GraphQL est un langage de requête pour les API, développé par Facebook. Contrairement à REST, il permet au client de demander uniquement les données dont il a besoin, ce qui réduit le volume d'informations transmises et accélère le fonctionnement des applications. Dans ce tutoriel, nous allons créer un serveur GraphQL simple en C++ en utilisant la bibliothèque graphql-cpp. Vous apprendrez à définir un schéma, écrire des résolveurs et traiter les requêtes et mutations.
Qu'est-ce que GraphQL et pourquoi C++ ?
GraphQL fournit un point d'accès unique pour toutes les requêtes. Les concepts principaux :
- Schéma (Schema) — description des types de données disponibles et des opérations (requêtes, mutations, abonnements).
- Requêtes (Queries) — opérations de lecture de données.
- Mutations (Mutations) — opérations d'écriture/modification de données.
- Résolveurs (Resolvers) — fonctions qui retournent les données pour chaque champ.
C++ est un langage puissant pour les systèmes à forte charge. L'utilisation de GraphQL avec C++ permet de créer des API efficaces et évolutives. La bibliothèque graphql-cpp fournit une interface pratique pour l'intégration.
Installation et configuration du projet
Pour travailler, nous aurons besoin de :
- Compilateur C++17 (par exemple, g++ ou MSVC).
- Bibliothèque
graphql-cpp(installation via vcpkg ou compilation à partir des sources). - Serveur HTTP (nous utiliserons
cpp-httplibpour simplifier).
Installation via vcpkg
vcpkg install graphql-cppvcpkg install cpp-httplibStructure du projet
Créez les fichiers :
main.cpp— point d'entrée et serveur HTTP.schema.hpp— définition du schéma GraphQL.resolvers.hpp— implémentation des résolveurs.CMakeLists.txt— configuration de la compilation.
Définition du schéma GraphQL
Créons un schéma simple pour gérer une liste d'utilisateurs. Le type User contient les champs id, name et email. Requêtes : users (liste de tous les utilisateurs) et user(id: ID!) (un utilisateur). Mutation : addUser(name: String!, email: String!): User.
Dans le fichier schema.hpp :
#ifndef SCHEMA_HPP#define SCHEMA_HPP
#include <graphqlcpp/GraphQLSchema.h>
using namespace graphqlcpp;
// Définition du type Userauto userType = std::make_shared<ObjectType>( "User", { {"id", Type::NonNull(Type::ID)}, {"name", Type::NonNull(Type::String)}, {"email", Type::NonNull(Type::String)} });
// Définition de Queryauto queryType = std::make_shared<ObjectType>( "Query", { {"users", Type::List(Type::NonNull(userType))}, {"user", Type::NonNull(userType), {{"id", Type::NonNull(Type::ID)}}} });
// Définition de Mutationauto mutationType = std::make_shared<ObjectType>( "Mutation", { {"addUser", Type::NonNull(userType), { {"name", Type::NonNull(Type::String)}, {"email", Type::NonNull(Type::String)} }} });
// Assemblage du schémaauto schema = std::make_shared<Schema>(queryType, mutationType);
#endif // SCHEMA_HPPImplémentation des résolveurs
Les résolveurs sont des fonctions qui retournent les données pour chaque champ. Dans notre exemple, les données seront stockées dans un vecteur global. Dans le fichier resolvers.hpp :
#ifndef RESOLVERS_HPP#define RESOLVERS_HPP
#include <vector>#include <string>#include <graphqlcpp/Resolvers.h>
using namespace graphqlcpp;
struct User { std::string id; std::string name; std::string email;};
std::vector<User> users = { {"1",