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.
beastaus 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 installAnwendungsbeispiel
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:
Auch in der Bibliothek
HTML-Parsing in C# (.NET): Bibliotheken HtmlAgilityPack und AngleSharp
gRPC für JavaScript (Node.js): Bibliotheken, Einrichtung und Codebeispiele
Arbeiten mit Excel in C++: Bibliotheken und Werkzeuge zum Lesen und Schreiben
TypeORM für JavaScript (Node.js): Komplettguide mit Beispielen
PDFKit für JavaScript (Node.js): Komplettguide mit Beispielen
Empfehlungen