GraphQL API in C++: Schritt-für-Schritt-Tutorial mit praktischen Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: GraphQL und C++ – ein starkes Duo für moderne APIs

\n\n

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

\n\n

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

1. Umgebungsvorbereitung und Abhängigkeiten installieren

\n\n

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

Installation über 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

Projektstruktur

\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

Jetzt ist alles bereit zum Schreiben des Codes.

\n\n

2. GraphQL-Schema und Typen definieren

\n\n

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

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

Blogs

Buchempfehlungen