API GraphQL en C++ : tutoriel pas à pas avec exemples pratiques

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

Introduction : GraphQL et C++ — un duo puissant pour une API moderne

\n\n

GraphQL 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.

\n\n

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\n

1. Préparation de l'environnement et installation des dépendances

\n\n

Pour 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
\n\n

Installation via vcpkg

\n
git clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n./bootstrap-vcpkg.sh\n./vcpkg install graphql-cpp cpp-httplib nlohmann-json
\n\n

Structure du projet

\n
graphql-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\n

CMakeLists.txt

\n
cmake_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\n

Maintenant, tout est prêt pour écrire le code.

\n\n

2. Définition du schéma GraphQL et des types

\n\n

Commenç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.

\n\n

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\n

schema.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                

Blogs

Book Recommendations