graphql用一種高效清晰的規範來替代目前正流行的restful架構。通過靈活的結構化查詢語言讓查詢更高效,靜態型別和規範提公升前後端聯調效率。作為一名前端我非常喜歡graphql,夢想有一天以前所有零散又沒有文件的介面都被graphql所代替,這將極大提公升我的開發效率和開發體驗。等待不如自己動手,下面將介紹如何編寫乙個基於hackernews api的graphql服務。
這個graphql服務和hackernews官方api類似,提供了獲取文章和使用者資訊的介面。
在開發graphql服務前你可能需要知道graphql提供了哪些能力,以及graphql定義了哪些規範,這些都可以在這裡學習。
graphql服務核心概念
型別(type):type是最基礎的因為graphql服務返回資料一定是定義好的型別的單個或者陣列。型別就像面對物件程式設計裡的class,返回資料是class的例項
字段(filed):filed組成type,乙個type由多個filed構成。filed就像面對物件程式設計裡的class的乙個屬性。每個欄位都有返回型別,返回型別是定義的type
查詢(query):通過query來暴露graphql服務所提供的所有讀介面,query就是type它由filed組成
變化(mutation):通過mutation來暴露graphql服務所提供的寫介面,mutation就是type它由filed組成
graphql服務由type和filed構成,type和filed相互依賴
由於type由filed構成,編寫graphql服務的核心工作就是編寫filed,如何獲取資料和處理寫操作的邏輯全來自於filed。
接下來將使用golang開始編寫。
所有查詢的入口(query):
var rootquery = graphql.newobject(graphql.objectconfig, error) , error)
model.getkv("topstories", &ids)
return model.getstories(ids), nil
以上**暴露出了2個查詢介面(也是2個字段)
story欄位通過id獲取乙個story,該欄位返回型別是storytype
topstories獲取500個熱門的story,該欄位返回型別是[storytype]
可以看到獲取資料的邏輯都在resolve函式裡,由於篇幅有限model 裡封裝的如何去資料庫獲取資料的**忽略了。
storytype的**
var storytype = graphql.newobject(graphql.objectconfig, error) {
poll := p.source.(*model.poll)
return model.getcomments(poll.kids), nil
「駱駝」怎麼寫
jelly是某大學計算機專業的學生,平時愛敲敲 上課卻不認真聽講。這不期末考試了,考英語的時候急得滿頭大汗。心想 平時整天敲那麼多字母,這英語咋就沒長進呢。看著最後一道作文題 請以 沙漠之舟 駱駝為題寫100詞左右。jelly想,沙漠之舟,沙漠之舟,a a boat of the the deser...
簡歷怎麼寫
簡歷為啥會石沉大海?想想問題還是出在對自己總結不夠,核心優勢沒有突出。簡歷想清楚在職期間自己的目標是什麼?基於這些目標,你都拆解了哪些動作 策略?基於這些動作跟策略你實際的產出跟業績是什麼?同時也要想下,這段工作期間你的收穫是什麼,專案中存在哪些不足,如果再來一次你重點考慮哪些方面。面試官很多時候只...
指令碼怎麼寫???
在micas的這段時間,我深刻體會到了linux系統與寫指令碼做 做綜合 做分析的重要性,對於乙個硬體開發者而言,學會linux系統的操作也是以編寫指令碼 執行指令碼為目的的。這篇隨筆我會記錄一些最基本的linux命令,以及四種指令碼的使用方法以及一些例項。想系統學習可以上這個網 但我建議先了解然後...