GraphQL in C++: Die Bibliothek cppgraphqlgen für moderne APIs

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

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 Dienstprogramm graphqlgen erstellt 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:

  1. Codegenerator (graphqlgen) – liest das Schema und erstellt Header-Dateien mit Klassen für jeden Typ, Schnittstellen für Resolver und Hilfsfunktionen.
  2. 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 install


Fü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 ./generated


Danach 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"

Empfehlungen