GraphQL API mit Go: Schritt-für-Schritt-Tutorial in der Praxis

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

Einleitung: Warum GraphQL und Go das ideale Paar sind

\n

In der modernen Webentwicklung ist GraphQL zum Standard für die Erstellung flexibler und effizienter APIs geworden. In Kombination mit der Sprache Go (Golang), die für ihre Leistung und Einfachheit bekannt ist, erhalten Sie ein leistungsstarkes Werkzeug für die Backend-Entwicklung. In diesem Schritt-für-Schritt-Tutorial erstellen wir eine vollwertige GraphQL API in Go von Grund auf mit der beliebten Bibliothek gqlgen.

\n

Sie erfahren, wie Sie das Projekt einrichten, das Schema definieren, Resolver implementieren und Middleware für die Authentifizierung hinzufügen. Am Ende des Artikels haben Sie eine funktionierende API, die bereit für die Integration mit jedem Frontend ist.

\n\n

1. Projekteinrichtung und Installation der Abhängigkeiten

\n

Als erstes erstellen wir ein neues Go-Modul und installieren die erforderlichen Pakete. Stellen Sie sicher, dass Go Version 1.18 oder höher installiert ist.

\n
mkdir graphql-go-tutorial\ncd graphql-go-tutorial\ngo mod init graphql-go-tutorial\ngo get github.com/99designs/gqlgen@latest\ngo get github.com/99designs/gqlgen/graphql/introspection@latest
\n

Jetzt initialisieren wir gqlgen im Projekt. Dieser Befehl erstellt eine grundlegende Dateistruktur:

\n
go run github.com/99designs/gqlgen init
\n

Nach der Ausführung sehen Sie die folgende Struktur:

\n
    \n
  • graph/ — Verzeichnis mit Schema- und Resolver-Dateien
  • \n
  • graph/schema.graphqls — Definition des GraphQL-Schemas
  • \n
  • graph/resolver.go — Platzhalter für Resolver
  • \n
  • server.go — Einstiegspunkt der Anwendung
  • \n
  • gqlgen.yml — Konfiguration des Generators
  • \n
\n\n

2. Definition des GraphQL-Schemas

\n

Öffnen wir die Datei graph/schema.graphqls und definieren unser Datenmodell. Als Beispiel erstellen wir ein einfaches Aufgabenverwaltungssystem (Task Manager):

\n
type Task {\n  id: ID!\n  title: String!\n  description: String\n  status: TaskStatus!\n  createdAt: Time!\n}\n\nenum TaskStatus {\n  TODO\n  IN_PROGRESS\n  DONE\n}\n\ntype Query {\n  tasks(status: TaskStatus): [Task!]!\n  task(id: ID!): Task\n}\n\ntype Mutation {\n  createTask(title: String!, description: String): Task!\n  updateTask(id: ID!, title: String, description: String, status: TaskStatus): Task!\n  deleteTask(id: ID!): Boolean!\n}\n\nscalar Time
\n

Nach dem Speichern des Schemas starten wir die Codegenerierung:

\n
go run github.com/99designs/gqlgen generate
\n

Dieser Befehl erstellt die Datei graph/model/models_gen.go mit Go-Strukturen und aktualisiert die Resolver.

\n\n

3. Implementierung der Resolver und Geschäftslogik

\n

Jetzt implementieren wir die Logik in der Datei graph/schema.resolvers.go. Zuerst erstellen wir einen einfachen In-Memory-Speicher:

\n
// In graph/resolver.go fügen wir den Speicher hinzu\ntype Resolver struct {\n  tasks []*model.Task\n  mu    sync.Mutex\n}\n\nfunc NewResolver() *Resolver {\n  return &Resolver{\n    tasks: make([]*model.Task, 0),\n  }\n}
\n

Jetzt implementieren wir die Resolver für Query und Mutation:

\n
// Query.Task\nfunc (r *queryResolver) Task(ctx context.Context, id string) (*model.Task, error) {\n  r.mu.Lock()\n  defer r.mu.Unlock()\n  \n  for _, task := range r.tasks {\n    if task.ID == id {\n      return task, nil\n    }\n  }\n  return nil, fmt.Errorf("task not found")\n}\n\n// Mutation.CreateTask\nfunc (r *mutationResolver) CreateTask(ctx context.Context, title string, description *string) (*model.Task, error) {\n  r.mu.Lock()\n  defer r.mu.Unlock()\n  \n  task := &model.Task{\n    ID:          uuid.New().String(),\n    Title:       title,\n    Description: description,\n    Status:      model.TaskStatusTodo,\n    CreatedAt:   time.Now(),\n  }\n  \n  r.tasks = append(r.tasks, task)\n  return task, nil\n}\n\n// Mutation.UpdateTask\nfunc (r *mutationResolver) UpdateTask(ctx context.Context, id string, title *string, description *string, status *model.TaskStatus) (*model.Task, error) {\n  r.mu.Lock()\n  defer r.mu.Unlock()\n  \n  for _, task                

Blogs

Buchempfehlungen