Machen Sie los GraphQL API

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.

Source: https://habr.com/ru/post/de449286/


All Articles