Introduction : GraphQL et C++ — un duo puissant pour une API moderne
\n\nGraphQL devient le standard de facto pour construire des API flexibles et efficaces. Alors que la plupart des tutoriels se concentrent sur JavaScript ou Python, le C++ reste indispensable pour les systèmes à haute charge, les serveurs de jeux et les solutions embarquées. Dans ce guide pas à pas, nous allons créer une API GraphQL complète en C++ à partir de zéro, en utilisant la bibliothèque graphql-cpp et le serveur cpp-httplib.
Vous apprendrez à configurer l'environnement, définir le schéma, implémenter les résolveurs et lancer le serveur. Tous les exemples de code peuvent être immédiatement appliqués dans des projets réels.
\n\n1. Préparation de l'environnement et installation des dépendances
\n\nPour travailler, nous aurons besoin de :
\n- \n
- Un compilateur prenant en charge C++17 (GCC 8+, Clang 7+, MSVC 2019+) \n
- CMake (version 3.14+) \n
- La bibliothèque
graphql-cpp(implémentation GraphQL) \n - La bibliothèque
cpp-httplib(serveur HTTP) \n - Le gestionnaire de paquets vcpkg (optionnel, mais pratique) \n
Installation via vcpkg
\ngit clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n./bootstrap-vcpkg.sh\n./vcpkg install graphql-cpp cpp-httplib nlohmann-json\n\nStructure du projet
\ngraphql-cpp-api/\n├── CMakeLists.txt\n├── src/\n│ ├── main.cpp\n│ ├── schema.cpp\n│ ├── schema.h\n│ ├── resolvers.cpp\n│ └── resolvers.h\n└── vcpkg.json\n\nCMakeLists.txt
\ncmake_minimum_required(VERSION 3.14)\nproject(GraphQLCppApi)\n\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\nfind_package(graphql-cpp CONFIG REQUIRED)\nfind_package(cpp-httplib CONFIG REQUIRED)\nfind_package(nlohmann_json CONFIG REQUIRED)\n\nadd_executable(graphql_server\n src/main.cpp\n src/schema.cpp\n src/resolvers.cpp\n)\n\ntarget_link_libraries(graphql_server\n graphql-cpp::graphql-cpp\n cpp-httplib::cpp-httplib\n nlohmann_json::nlohmann_json\n)\n\nMaintenant, tout est prêt pour écrire le code.
\n\n2. Définition du schéma GraphQL et des types
\n\nCommençons par créer le schéma pour une API simple de gestion de livres. Nous aurons les types Book et Author, ainsi que des requêtes et des mutations.
schema.h
\n#ifndef SCHEMA_H\n#define SCHEMA_H\n\n#include <graphqlcpp/GraphQLSchema.h>\n\nstd::shared_ptr<graphql::GraphQLSchema> createSchema();\n\n#endif\n\nschema.cpp
\n#include "schema.h"\n#include "resolvers.h"\n\nstd::shared_ptr<graphql::GraphQLSchema> createSchema() {\n using namespace graphql;\n\n // Type Author\n auto authorType = object_type("Author", {\n field("id", int_type()),\n field("name", string_type()),\n field("books", list_type(int_type()))\n });\n\n // Type Book\n auto bookType = object_type("Book", {\n field("id", int_type()),\n field("title", string_type()),\n field("authorId", int_type()),\n field("year", int_type()),\n field("genre", string_type())\n });\n\n // Query root\n auto queryType = object_type("Query", {\n field("books", list_type(bookType), {\n argument("genre", string_type(), true) // argument optionnel\n }, resolveBooks),\n field("book", bookType, {\n argument("id", int_type(), false) // argument obligatoire\n }, resolveBookById),\n field("authors", list_type(authorType), resolveAuthors)\n });\n\n // Mutation root\n auto mutationType = object_type("Mutation", {\n field("addBook", bookType, {\n argument("title", string_type(), false),\n argument("authorId", int_type(), false),\n argument("year", int_type(), false),\n argument("genre", string_type(), false)\n }, resolveAddBook),\n field("deleteBook", bool_type(), {\n argument("id", int_type(), false)\n }, res