1. Fügen Sie den graphiql-Client hinzu, um das Projekt zu starten

Graphiql ist ein interaktiver GraphQL-Browser-Client.
Um es in einem go-Projekt zu verwenden, müssen Sie eine HTML-Seite mit mehreren Abhängigkeiten hinzufügen.
Wenn Sie die neuesten Versionen benötigen, können Sie Knoten und Pakete installieren. Das Projekt wird stark wachsen. Es besteht die Möglichkeit, HTML in einer One-Go-Datei zu sammeln und beim Start Abhängigkeiten mit cdn abzurufen.
Meine Version von go-graphiql .
Um zu arbeiten, müssen Sie nur hinzufügen:
http.HandleFunc("/cli", graphiql.ServeGraphiQL)
Das Ergebnis ist:

2. Mal sehen, wie die API in Bezug auf den Browser funktioniert
Öffnen Sie im Browser die Entwicklerkonsole und fügen Sie den js-Code hinzu:
let q=`{getMessage}` let v={} let options = (query, variables={}) =>{ return { method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json', }, body: JSON.stringify({ query, variables }), } }; let o = options(q, v) console.log(o) fetch("http://localhost:9000/graphql",o) .then(response=>response.json()) .then(console.log)
Ausführungsergebnis:

Es liegt ein Fehler in der API vor. Es ist notwendig, den Text der Nachricht zu ändern.
q=`mutation { setMessage(msg: "Hello Habr") } ` v={} o = options(q, v) console.log(o) fetch("http://localhost:9000/graphql",o) .then(response=>response.json()) .then(console.log)
Ausführungsergebnis:

3. Mal sehen, wie es aus Sicht des Servers funktioniert.
Der Workflow wird vom Objekt beschrieben
schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: types.RootQuery, Mutation: types.RootMutation, })
Abfrage
Datenabruf
var RootQuery = graphql.NewObject(graphql.ObjectConfig{ Name: "RootQuery", Fields: graphql.Fields{ "getMessage": &graphql.Field{ Type: graphql.String, Resolve: func(p graphql.ResolveParams) (interface{}, error) { msg := logic.GetMessage() return msg, nil }, }, }, })
Die Resolve-Funktion ruft Daten für uns ab. Daten können von einer beliebigen Quelle aus der Datenbank zum Mikrocontroller stammen
Mutation
Datenmutation
var RootMutation = graphql.NewObject(graphql.ObjectConfig{ Name: "RootMutation", Fields: graphql.Fields{ "setMessage": &graphql.Field{ Type: graphql.String, Args: graphql.FieldConfigArgument{ "msg": &graphql.ArgumentConfig{Type: graphql.NewNonNull(graphql.String)}, }, Resolve: func(p graphql.ResolveParams) (interface{}, error) { msg := p.Args["msg"].(string) logic.SetMessage(msg) return msg, nil }, }, }, })
Das Bearbeiten von Daten erfolgt auch mit der Funktion Auflösen.
Das Auflösen kann auch Lichtereignisse erzeugen oder die Temperatur anpassen.
Ein interessanter Punkt ist, dass der Typ der zurückgegebenen Daten auch graphql.Fields haben kann, die auch ihre eigenen Resolve-Funktionen haben.
4. Typisierte Sprachen?
Es gibt einige Einschränkungen (Funktionen) beim Datenaustausch.
In go haben Variablen Standardwerte
Int ist 0, String = ""
In graphql kann es vorkommen, dass keine Variable festgelegt ist.
Daher verwenden wir für solche Parameter einen Link zu einer Variablen
In Fortsetzung,
Ich werde schreiben, wie man graphql api in die Open Data Registry macht.
Weil Programmierer die faulsten Menschen auf dem Planeten sind. Wir werden die API machen, damit wir etwas weniger machen.
TODO:
API-Starter-Kit
Schema
Es gibt ein interessantes Projekt, das ein Schema für den Text erstellt.
func main() { s := ` schema { query: Query } type Query { hello: String! } ` schema := graphql.MustParseSchema(s, &query{}) http.Handle("/query", &relay.Handler{Schema: schema}) log.Fatal(http.ListenAndServe(":8080", nil)) }
github.com/graph-gophers/graphql-go
resolv
Ich werde einen Generator für Felder nach Strukturen erstellen
Abfrage
habe nicht herausgefunden, wie man Abfragen mit einem Generator erstellt
Warten auf Vorschläge.