GraphQL in C++: Die Bibliothek cppgraphqlgen zur API-Erstellung

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 Bibliothek C++: cppgraphqlgen



cppgraphqlgen ist eine moderne Bibliothek in C++ zur Implementierung der serverseitigen GraphQL-Logik. Sie ermöglicht Entwicklern die Erstellung typsicherer, schneller und skalierbarer APIs unter Nutzung der Vorteile der statischen Typisierung von C++. Die Bibliothek generiert Code basierend auf dem GraphQL-Schema (.graphql-Dateien), was das manuelle Schreiben von Resolvern minimiert und die Fehlerwahrscheinlichkeit reduziert.



Hauptfunktionen

  • Codegenerierung aus dem Schema — als Eingabe wird eine Datei schema.graphql verwendet, als Ausgabe erhält man C++-Klassen und -Funktionen.
  • Typsicherheit — alle GraphQL-Typen (String, Int, Float, Boolean, ID, Enum, Input, Object) werden in die entsprechenden C++-Typen kompiliert.
  • Unterstützung von Subscriptions — implementiert über WebSocket und asynchrone Streams.
  • Anfragevalidierung — integrierte Überprüfung der Syntax und Semantik von GraphQL-Anfragen.
  • HTTP-Integration — funktioniert mit jedem C++-HTTP-Server (z. B. beast aus Boost).
  • Unterstützung von Direktiven — benutzerdefinierte Direktiven zur Erweiterung der Funktionalität.


Installation

Für die Installation von cppgraphqlgen wird ein Compiler mit C++17-Unterstützung und das Build-System CMake benötigt. Installation über vcpkg oder Build aus den Quellen:

# Über vcpkgvcpkg install cppgraphqlgen

# Build aus dem Repositorygit clone https://github.com/microsoft/cppgraphqlgen.gitcd cppgraphqlgenmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasecmake --build . --target install


Anwendungsbeispiel

Betrachten wir ein einfaches Beispiel: Wir erstellen ein GraphQL-Schema zum Abrufen von Informationen über einen Benutzer und ein Buch. Zuerst definieren wir das Schema schema.graphql:

type Query {  user(id: ID!): User  book(id: ID!): Book}

type User { id: ID! name: String! email: String}

type Book { id: ID! title: String! author: String!}


Nach der Codegenerierung (Befehl graphqlgen) erhalten wir die Datei Generated.h. Jetzt schreiben wir die Resolver in C++:

#include "Generated.h"#include <unordered_map>

// Beispieldaten (in einem echten Projekt — Datenbank)std::unordered_map<std::string, User> users = { {"1", {"1", "Alice", "alice@example.com"}}, {"2", {"2", "Bob", nullptr}}};

std::unordered_map<std::string, Book> books = { {"10", {"10", "C++ Primer", "Lippman"}}, {"20", {"20", "Effective Modern C++", "Meyers"}}};

// Resolver für Query.userUser resolveGetUser(const std::string& id) { auto it = users.find(id); if (it != users.end()) { return it->second; } throw std::runtime_error("User not found");}

// Resolver für Query.bookBook resolveGetBook(const std::string& id) { auto it = books.find(id); if (it != books.end()) { return it->second; } throw std::runtime_error("Book not found");}


Jetzt konfigurieren wir den Server und starten die Verarbeitung von Anfragen:

#include <graphqlservice/GraphQLService.h>#include <beast/http.hpp>

int main() { // Dienst mit Schema erstellen auto service = std::make_shared<graphql::service::GraphQLService>();

// Resolver registrieren service->addResolver("Query", "user", resolveGetUser); service->addResolver("Query", "book", resolveGetBook);

// HTTP-Server starten (vereinfacht) http::server server("0.0.0.0", 8080, service); server.run();

return 0;}


Fehlerbehandlung und Validierung

Die Bibliothek überprüft automatisch die Korrektheit eingehender Anfragen. Wenn ein Resolver eine Ausnahme auslöst, wandelt cppgraphqlgen diese in einen GraphQL-Fehler mit dem entsprechenden Code um. Beispiel für die Behandlung:


                
    
    

Empfehlungen