1. إضافة عميل graphiql للذهاب المشروع

Graphiql هو عميل متصفح GraphQL تفاعلي.
لاستخدامها في مشروع go ، تحتاج إلى إضافة صفحة html مع العديد من التبعيات.
إذا كنت بحاجة إلى الحصول على أحدث الإصدارات ، فسوف يساعد ذلك في تثبيت العقدة والحزم. المشروع سوف ينمو بشكل كبير. هناك خيار لجمع HTML في ملف بنقرة واحدة وسحب ما يصل التبعيات مع cdn عند بدء التشغيل.
روايتي لـ go-graphiql .
للعمل ، تحتاج إلى إضافة فقط:
http.HandleFunc("/cli", graphiql.ServeGraphiQL)
والنتيجة هي:

2. دعنا نرى كيف يعمل API من حيث المتصفح
في المستعرض ، افتح وحدة التحكم بالمطور وأضف كود 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 }, }, }, })
يحدث أيضًا تحرير البيانات باستخدام وظيفة حل.
يمكن حل أيضا إنشاء أحداث الضوء أو ضبط درجة الحرارة.
النقطة المهمة هي أن نوع البيانات التي يتم إرجاعها يمكن أن يحتوي أيضًا على graphql.Fields والذي سيكون له أيضًا وظائف Resolve.
4. اللغات المكتوبة؟
هناك بعض القيود (ميزات) لتبادل البيانات.
في الذهاب ، والمتغيرات لها القيم الافتراضية
Int هي 0 ، السلسلة = ""
في graphql ، قد يكون هناك موقف عندما لا يتم تعيين متغير.
لذلك ، بالنسبة لهذه المعلمات ، نستخدم رابطًا لمتغير
في استمرار ،
سأكتب كيفية جعل graphql api في Open Data Registry.
لأن المبرمجين هم أكثر الناس كسولًا على هذا الكوكب. سنفعل API حتى نفعل شيئا أقل.
TODO:
ابي كاتب كيت
مخطط
هناك مشروع مثير للاهتمام يقوم بإنشاء مخطط للنص.
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
سأصنع مولد للحقول بواسطة الهياكل
سؤال
لم معرفة كيفية بناء الاستفسارات مع مولد
في انتظار الاقتراحات.