1. рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдЬреЛрдбрд╝реЗрдВ

Graphiql рдПрдХ рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рд╡ рдЧреНрд░рд╛рдлрдХреЙрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИред
рдЗрд╕реЗ рдЧреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдИ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ html рдкреГрд╖реНрда рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
рдпрджрд┐ рдЖрдкрдХреЛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдиреЛрдб рдФрд░ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрд╣реБрдд рдмрдврд╝реЗрдЧреАред HTML рдХреЛ рдПрдХ рдЧреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╕реАрдбреАрдПрди рдХреЗ рд╕рд╛рде рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред
рдЧреЛ-рдЧреНрд░рд╛рдлрд┐рдХреНрд▓ рдХрд╛ рдореЗрд░рд╛ рд╕рдВрд╕реНрдХрд░рдгред
рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
http.HandleFunc("/cli", graphiql.ServeGraphiQL)
рдкрд░рд┐рдгрд╛рдо рд╣реИ:

2. рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдкреАрдЖрдИ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рдбреЗрд╡рд▓рдкрд░ рдХрдВрд╕реЛрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ 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)
рдирд┐рд╖реНрдкрд╛рджрди рдкрд░рд┐рдгрд╛рдо:

API рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИред рд╕рдВрджреЗрд╢ рдХреЗ рдкрд╛рда рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
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)
рдирд┐рд╖реНрдкрд╛рджрди рдкрд░рд┐рдгрд╛рдо:

3. рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рд╕рд░реНрд╡рд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдХрд╛рд░реНрдп рдХреА рдпреЛрдЬрдирд╛ рд╡рд╕реНрддреБ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИ:
schema, err := graphql.NewSchema(graphql.SchemaConfig{ Query: types.RootQuery, Mutation: types.RootMutation, })
рд╕рд╡рд╛рд▓
рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐
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 }, }, }, })
рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдлрд╝рдВрдХреНрд╢рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдорд╛рдЗрдХреНрд░реЛ рдХрдВрдЯреНрд░реЛрд▓рд░ рддрдХ рдХрд┐рд╕реА рднреА рд╕реНрд░реЛрдд рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдкрд░рд┐рд╡рд░реНрддрди
рдбреЗрдЯрд╛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди
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 }, }, }, })
рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдкрд╛рджрди рдбреЗрдЯрд╛ рднреА рд╣реЛрддрд╛ рд╣реИред
рд╣рд▓ рдкреНрд░рдХрд╛рд╢ рдШрдЯрдирд╛рдУрдВ рдХреЛ рднреА рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рддрд╛рдкрдорд╛рди рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдлреАрд▓реНрдбреНрд╕ рдЬрд┐рдирдореЗрдВ рд╕реНрд╡рдпрдВ рдХреЗ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдлрд╝рдВрдХреНрд╢рди рднреА рд╣реЛрдВрдЧреЗред
4. рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛рдПрдБ?
рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХреЗ рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдз (рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ) рд╣реИрдВред
рдЬрд╛рдиреЗ рдореЗрдВ, рдЪрд░ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реИрдВ
рдЗрдВрдЯ 0 рд╣реИ, рд╕реНрдЯреНрд░рд┐рдВрдЧ = ""
рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдореЗрдВ, рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдПрдХ рдЪрд░ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдРрд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
рдирд┐рд░рдВрддрд░рддрд╛ рдореЗрдВ,
рдореИрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ рдХрд┐ рдУрдкрди рдбреЗрдЯрд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдПрдкреА рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред
рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЧреНрд░рд╣ рдкрд░ рд╕рдмрд╕реЗ рдЖрд▓рд╕реА рд▓реЛрдЧ рд╣реИрдВред рд╣рдо рдПрдкреАрдЖрдИ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╣рдо рдХреБрдЫ рдХрдо рдХрд░реЗрдВред
рдХрд╛рд░реНрдпрд╕реВрдЪреА:
рдЖрдкреА рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ
рдпреЛрдЬрдирд╛
рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬреЛ рдкрд╛рда рдХреЗ рд▓рд┐рдП рдПрдХ рдпреЛрдЬрдирд╛ рдмрдирд╛рддреА рд╣реИред
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
рдирд┐рд░рд╛рдХрд░рдг
рдореИрдВ рд╕рдВрд░рдЪрдирд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЦреЗрддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдирд░реЗрдЯрд░ рдмрдирд╛рдКрдВрдЧрд╛
рд╕рд╡рд╛рд▓
рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд░реЗрдВ, рдЗрд╕рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛
рд╕реБрдЭрд╛рд╡реЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИред