Einführung in GraphQL und Go
GraphQL ist eine Abfragesprache für APIs, die von Facebook entwickelt wurde. Im Gegensatz zu REST, wo jeder Endpunkt eine feste Datenstruktur zurückgibt, erlaubt GraphQL dem Client, nur die Felder anzufragen, die er benötigt. Dies reduziert die Anzahl der Anfragen und die Menge der übertragenen Daten. Go (Golang) ist eine ausgezeichnete Wahl für die Erstellung leistungsstarker APIs aufgrund seiner Geschwindigkeit, statischen Typisierung und integrierten Unterstützung für Nebenläufigkeit.
In diesem Tutorial erstellen wir eine einfache GraphQL-API in Go zur Verwaltung einer Bücherliste. Sie lernen, wie Sie einen Server einrichten, ein Schema definieren, Resolver schreiben und Abfragen und Mutationen ausführen.
Projekt einrichten und Bibliotheken installieren
Go-Modul initialisieren
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-tutorialBibliothek graphql-go installieren
Wir verwenden die beliebte Bibliothek graphql-go/graphql. Installieren Sie sie mit dem Befehl:
go get github.com/graphql-go/graphqlgo get github.com/graphql-go/handlerDie erste Bibliothek stellt den GraphQL-Kern bereit, die zweite einen HTTP-Handler für die Integration mit dem Webserver.
Datenstruktur und GraphQL-Schema erstellen
Typ Book definieren
Erstellen Sie die Datei main.go und beginnen Sie mit der Definition der Buch-Datenstruktur und des entsprechenden GraphQL-Typs:
package main
import ( "github.com/graphql-go/graphql" "github.com/graphql-go/handler" "net/http")
// Book — Datenstruktur für ein Buchtype Book struct { ID string `json:"id"` Title string `json:"title"` Author string `json:"author"` Year int `json:"year"`}
// Definieren des GraphQL-Typs für ein Buchvar bookType = graphql.NewObject( graphql.ObjectConfig{ Name: "Book", Fields: graphql.Fields{ "id": &graphql.Field{Type: graphql.String}, "title": &graphql.Field{Type: graphql.String}, "author": &graphql.Field{Type: graphql.String}, "year": &graphql.Field{Type: graphql.Int}, }, },)Root-Query erstellen
Fügen wir einen In-Memory-Bücherspeicher und einen Root-Query hinzu, um die Liste und ein einzelnes Buch abzurufen:
// Simulierte Datenbankvar books = []Book{ {ID: "1", Title: "Krieg und Frieden", Author: "Lew Tolstoi", Year: 1869}, {ID: "2", Title: "Verbrechen und Strafe", Author: "Fjodor Dostojewski", Year: 1866}, {ID: "3", Title: "Der Meister und Margarita", Author: "Michail Bulgakow", Year: 1967},}
// Root-Queryvar queryType = graphql.NewObject( graphql.ObjectConfig{ Name: "Query", Fields: graphql.Fields{ "books": &graphql.Field{ Type: graphql.NewList(bookType), Resolve: func(p graphql.ResolveParams) (interface{}, error) { return books, nil }, }, "book": &graphql.Field{ Type: bookType, Args: graphql.FieldConfigArgument{ "id": &graphql.ArgumentConfig{Type: graphql.String}, }, Resolve: func(p graphql.ResolveParams) (interface{}, error) { id, _ := p.Args["id"].(string) for _, book := range books { if book.ID == id { return book, nil } } return nil, nil }, }, }, },)Mutationen hinzufügen
Mutationen ermöglichen das Ändern von Daten. Fügen wir die Möglichkeit hinzu, neue Bücher hinzuzufügen:
// Mutation zum Hinzufügen eines Buchesvar mutationType = graphql.NewObject(