Make on go GraphQL API

1. Ajouter un client graphiql au projet go



Graphiql est un client de navigation GraphQL interactif.


Pour l'utiliser dans un projet go, vous devez ajouter une page html avec plusieurs dépendances.
Si vous avez besoin des dernières versions, cela vous aidera à installer le nœud et les packages. Le projet va grandir considérablement. Il existe une option pour collecter du HTML dans un fichier go et extraire les dépendances avec cdn au démarrage.


Ma version de go-graphiql .


Pour travailler, vous devez ajouter uniquement:


http.HandleFunc("/cli", graphiql.ServeGraphiQL) 

Le résultat est:



2. Voyons comment l'API fonctionne en termes de navigateur


Dans le navigateur, ouvrez la console développeur et ajoutez le code js:


 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) 

Résultat d'exécution:


Il y a une erreur dans l'API. Il est nécessaire de changer le texte du message.

 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) 

Résultat d'exécution:


3. Voyons comment cela fonctionne du point de vue du serveur.


Le workflow est décrit par l'objet


  schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: types.RootQuery, Mutation: types.RootMutation, }) 

Requête

Récupération de données


 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 }, }, }, }) 

La fonction Résoudre obtient des données pour nous. Les données peuvent provenir de n'importe quelle source de la base de données vers le microcontrôleur


Mutation

Mutation de données


 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 }, }, }, }) 

La modification des données s'effectue également à l'aide de la fonction Résoudre.
Resolve peut également créer des événements lumineux ou ajuster la température.


Un point intéressant est que le type de données retournées peut également avoir graphql.Fields qui aura également ses propres fonctions Resolve.


4. Langues tapées?


Il existe certaines restrictions (fonctionnalités) à l'échange de données.
En cours, les variables ont des valeurs par défaut
Int est 0, String = ""


Dans graphql, il peut y avoir une situation où une variable n'est pas définie.


Par conséquent, pour ces paramètres, nous utilisons un lien vers une variable


En continuation,


J'écrirai comment créer une API graphql dans l'Open Data Registry.
Parce que les programmeurs sont les gens les plus paresseux de la planète. Nous ferons l'API pour que nous fassions quelque chose de moins.


TODO:


Kit de démarrage Api

schéma

Il y a un projet intéressant qui crée un schéma pour le texte.


 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

Je ferai un générateur de champs par structures


interroger

n'a pas compris comment créer des requêtes avec un générateur


En attente de suggestions.

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


All Articles