Einführung in GraphQL und Go
GraphQL ist eine Abfragesprache für APIs, die es Clients ermöglicht, genau die Daten zu erhalten, die sie benötigen, und nichts Überflüssiges. Im Gegensatz zu REST, wo jeder Endpunkt eine feste Datenstruktur zurückgibt, bietet GraphQL Flexibilität und Kontrolle. In Kombination mit Go (Golang) – einer schnellen, typsicheren und einfachen Sprache – erhalten Sie ein leistungsstarkes Werkzeug zur Erstellung moderner Webdienste.
In diesem Tutorial erstellen wir eine einfache GraphQL API in Go von Grund auf. Sie lernen, Abhängigkeiten zu installieren, ein Schema zu beschreiben, Resolver zu implementieren und einen Server zu starten. Der Artikel richtet sich an Anfänger, daher werden alle Schritte ausführlich erklärt.
1. Projektvorbereitung und Installation der Abhängigkeiten
Bevor Sie Code schreiben, stellen Sie sicher, dass Go Version 1.18 oder höher installiert ist. Erstellen Sie ein neues Verzeichnis für das Projekt und initialisieren Sie das Modul:
mkdir graphql-go-tutorialcd graphql-go-tutorialgo mod init graphql-go-tutorialBibliotheksauswahl: gqlgen
Es gibt mehrere Bibliotheken für die Arbeit mit GraphQL in Go. Wir verwenden gqlgen – einen beliebten Code-Generator, der Typen und Resolver basierend auf dem Schema erstellt. Installieren Sie ihn:
go get github.com/99designs/gqlgen@latestInitialisierung von gqlgen
Führen Sie den Befehl aus, um die Standarddateien zu erstellen:
go run github.com/99designs/gqlgen initDieser Befehl erstellt mehrere Dateien:
graph/schema.graphqls– die GraphQL-Schemadatei;graph/resolver.go– der Resolver-Rahmen;server.go– der Einstiegspunkt des Servers;gqlgen.yml– die Generierungskonfiguration.
2. Beschreibung des GraphQL-Schemas
Öffnen Sie die Datei graph/schema.graphqls. Standardmäßig gibt es dort bereits ein Beispiel mit dem Typ Todo. Wir werden es erweitern, indem wir den Typ User und einige Abfragen hinzufügen.
Ersetzen Sie den Inhalt der Datei durch Folgendes:
type User { id: ID! name: String! email: String!}
type Todo { id: ID! text: String! done: Boolean! user: User!}
type Query { todos: [Todo!]! users: [User!]! user(id: ID!): User}
type Mutation { createTodo(text: String!, userId: ID!): Todo! markDone(id: ID!): Todo!}Hier haben wir definiert:
- User – ein Benutzer mit den Feldern id, name, email.
- Todo – eine Aufgabe mit den Feldern id, text, done und einem Verweis auf den Benutzer.
- Query – Einstiegspunkte zum Lesen von Daten.
- Mutation – Operationen zum Ändern von Daten.
3. Codegenerierung und Implementierung der Resolver
Nach der Beschreibung des Schemas muss der Go-Code generiert werden. Führen Sie aus:
go run github.com/99designs/gqlgen generateDies erstellt die Datei models_gen.go und aktualisiert resolver.go. Öffnen Sie nun graph/resolver.go.
Hinzufügen eines Datenspeichers
Der Einfachheit halber speichern wir die Daten im Arbeitsspeicher. Fügen Sie die Struktur in resolver.go hinzu:
type Resolver struct { Users []*model.User Todos []*model.Todo}Vergessen Sie nicht, das Paket model zu importieren.
Implementierung der Abfragen (Query)
Suchen Sie die generierten Methoden für Query. Implementieren wir sie:
func (r *queryResolver) Todos(ctx context.Context) ([]*model.Todo, error) { return r.Resolver.Todos, nil}
func (r *queryResolver) Users(ctx context.Context) ([]*model.User, error) { return r.Resolver.Users, nil}
func (r *queryResolver) User(ctx context.Context, id string) (*model.User, error) { for _, u := range r.Resolver.Users { if u.ID == id { return u, nil } } return nil, fmt.Errorf("user not found")}
Blogs
Buchempfehlungen
Lesen Sie auch
Wie man überprüft, ob ein JavaScript-Objekt leer ist: 5 funktionierende Methoden
Client-IP in PHP: Wie man 2025 keine Fehler macht
Code-Review in Java: Was man prüfen und wie man Anfängern Feedback geben sollte
Git-Workflow für C#-Entwickler: Vom Chaos zur Ordnung
Angular kann Dienst nicht injizieren: Vollständige Fehleranalyse