GraphQL auf C++: cppgraphqlgen – ein leistungsstarkes Werkzeug für moderne APIs
GraphQL ist eine Abfragesprache für APIs, die es Clients ermöglicht, nur die benötigten Daten zu erhalten. Obwohl GraphQL meist mit JavaScript (Apollo, Relay) oder Python (Graphene, Strawberry) assoziiert wird, gibt es für hochlastige Systeme in C++ ebenfalls eine hervorragende Lösung – die Bibliothek cppgraphqlgen. Sie bietet einen vollständigen Satz von Werkzeugen zur Erstellung eines GraphQL-Backends in reinem C++ mit Unterstützung für die modernen Standards C++17/20.
Was ist cppgraphqlgen?
cppgraphqlgen ist eine Header-only-Bibliothek (mit optionaler Kompilierung in .so/.dll), die die GraphQL-Spezifikation (Juni 2018) implementiert. Sie generiert typsicheren Code basierend auf einem Schema (SDL – Schema Definition Language) und ermöglicht die Erstellung effizienter, multithread-fähiger GraphQL-Server.
Hauptmerkmale:
- Codegenerierung aus dem Schema – Sie beschreiben Typen, Abfragen und Mutationen in einer
.graphql-Datei, und das Dienstprogrammgraphqlgenerstellt C++-Klassen. - Typsicherheit – Alle Typen werden zur Kompilierzeit überprüft. Keine Laufzeitfehler mit Typen.
- Leistung – Minimale Gemeinkosten, Unterstützung für asynchrone Resolver (über
std::future). - Unterstützung für Abonnements (Subscriptions) – über WebSocket oder gRPC.
- Integration mit jedem HTTP-Server – kann mit
crow,drogon,beast(Boost.Asio) oder sogar einer eigenen Implementierung verwendet werden.
Architektur der Bibliothek
cppgraphqlgen besteht aus zwei Teilen:
- Codegenerator (
graphqlgen) – liest das Schema und erstellt Header-Dateien mit Klassen für jeden Typ, Schnittstellen für Resolver und Hilfsfunktionen. - Runtime-Bibliothek – Abfrageparser, Validator, Ausführer und Antwortserialisierer.
Installation
Die Bibliothek wird über vcpkg verteilt oder aus dem Quellcode erstellt:
git clone https://github.com/microsoft/cppgraphqlgen.gitcd cppgraphqlgenmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasecmake --build . --target installFür die Verwendung des Generators wird node.js benötigt (er ist in TypeScript geschrieben), aber die Runtime ist reines C++.
Beispiel: Erstellung eines einfachen GraphQL-Servers
Zuerst erstellen wir ein Schema schema.graphql:
type Query { hello: String user(id: Int!): User}
type User { id: Int name: String email: String}Dann starten wir den Generator:
graphqlgen --schema schema.graphql --output ./generatedDanach erscheinen im Ordner generated die Dateien: SchemaTypes.h, SchemaResolver.h und andere. Jetzt schreiben wir die Resolver:
#include "generated/SchemaTypes.h"#include "generated/SchemaResolver.h"
class QueryResolver : public graphql::schema::Query::Resolver {public: std::shared_ptr<graphql::schema::String> getHello() override { return std::make_shared<graphql::schema::String>("Hello, GraphQL from C++!"); }
std::shared_ptr<graphql::schema::User> getUser(int id) override { auto user = std::make_shared<graphql::schema::User>(); user->id = std::make_shared<graphql::schema::Int>(id); user->name = std::make_shared<graphql::schema::String>("John Doe"); user->email = std::make_shared<graphql::schema::String>("john@example.com"); return user; }};Jetzt bauen wir den Server mit crow:
#include <crow.h>#include "generated/Schema.h"
Auch in der Bibliothek
Quartz.NET für C# (.NET): Komplettguide mit Beispielen
Datenvalidierung in Go: Überblick über Bibliotheken und Ansätze
Arbeit mit Kafka in PHP: Bibliotheken, Installation und Codebeispiele
Arbeiten mit ZIP/Archiven in Swift (iOS/macOS): vollständige Anleitung
frozen für C++: Komplettguide mit Beispielen