Einleitung: GraphQL und C++ – ein starkes Duo für moderne APIs
\n\nGraphQL wird zum De-facto-Standard für den Aufbau flexibler und effizienter APIs. Während sich die meisten Tutorials auf JavaScript oder Python konzentrieren, bleibt C++ für hochlastige Systeme, Spieleserver und eingebettete Lösungen unverzichtbar. In dieser Schritt-für-Schritt-Anleitung erstellen wir eine vollwertige GraphQL API in C++ von Grund auf, unter Verwendung der Bibliothek graphql-cpp und des Servers cpp-httplib.
Sie erfahren, wie Sie die Umgebung einrichten, ein Schema definieren, Resolver implementieren und den Server starten. Alle Codebeispiele können sofort in realen Projekten verwendet werden.
\n\n1. Umgebungsvorbereitung und Abhängigkeiten installieren
\n\nFür die Arbeit benötigen wir:
\n- \n
- Einen Compiler mit C++17-Unterstützung (GCC 8+, Clang 7+, MSVC 2019+) \n
- CMake (Version 3.14+) \n
- Die Bibliothek
graphql-cpp(GraphQL-Implementierung) \n - Die Bibliothek
cpp-httplib(HTTP-Server) \n - Den Paketmanager vcpkg (optional, aber praktisch) \n
Installation über 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\nProjektstruktur
\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\nJetzt ist alles bereit zum Schreiben des Codes.
\n\n2. GraphQL-Schema und Typen definieren
\n\nBeginnen wir mit der Erstellung eines Schemas für eine einfache API zur Buchverwaltung. Wir werden die Typen Book und Author sowie Abfragen und Mutationen haben.
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 // Typ 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 // Typ 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) // optionales Argument\n }, resolveBooks),\n field("book", bookType, {\n argument("id", int_type(), false) // erforderliches Argument\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