摘要:怎么使用致力于提供一種直觀的彈性語法系統(tǒng),用以描述客戶端程序設(shè)計(jì)時(shí)的數(shù)據(jù)需求以及數(shù)據(jù)交互行為。這意味著客戶端需要的數(shù)據(jù),已經(jīng)在中制定好了。中采用的方式截然不同,的通常只暴露一個(gè)接口,而不是返回固定數(shù)據(jù)結(jié)構(gòu)的多個(gè)接口。
GraphQL是什么GraphQL是facebook開源的一套數(shù)據(jù)交互方案,它并非某種具體的語言或者框架,它只是提供了一套解決方案,這套解決方案通過GraphQL規(guī)范進(jìn)行定義,不同語言可以有自己的GraphQL實(shí)現(xiàn),目前已經(jīng)有很多語言完成了GraphQL的實(shí)現(xiàn),可以在這里查看。
怎么使用GraphQLGraphQL致力于提供一種直觀的彈性語法系統(tǒng),用以描述客戶端程序設(shè)計(jì)時(shí)的數(shù)據(jù)需求以及數(shù)據(jù)交互行為。通俗地講就是允許客戶端在請求中精確的定義自己需要什么,服務(wù)端根據(jù)客戶端的請求精確的返回相應(yīng)的內(nèi)容。比如有如下兩個(gè)相互關(guān)聯(lián)的實(shí)體:
Teacher{ name: String phone: String age: Int } School{ id: String name: String address: String teachers: List}
使用GraphQL查詢指定學(xué)校的名稱是這樣的:
school(schoolId: "schoolId1"){
name
}
返回:
data{
"name" : "北京大學(xué)"
}
如果想要查詢學(xué)校的名稱以及所有老師的名字和電話:
school(schoolId: "schoolId1"){
name
teachers{
name
phone
}
}
將得到:
data{
"name" : "北京大學(xué)"
"teachers" : [
{
"name" : "李老師",
"phone" : "13312345678"
},
{
"name" : "張老師",
"phone" : "13312345673"
},
{
"name" : "王老師",
"phone" : "13312345672"
}
]
}
以上只演示了GraphQL提供的查詢(query)功能,GraphQL還支持修改(mutation)和訂閱(subscription)。
要使得客戶端可以使用GraphQL的方式請求數(shù)據(jù),首先需要在服務(wù)端提供GraphQL服務(wù),這里可以查看現(xiàn)有的實(shí)現(xiàn)了GraphQL的平臺,關(guān)于如何搭建GraphQL的服務(wù),請查看GraphQL(二):GraphQL服務(wù)搭建
同時(shí),GraphQL提供了強(qiáng)大的開發(fā)者工具GraphiQL,可以實(shí)時(shí)查看數(shù)據(jù)模型和API,為前后端開發(fā)者提供了一個(gè)便捷的溝通平臺。
為什么要使用GraphQL通過上面的內(nèi)容,大致可以了解GraphQL給前后端數(shù)據(jù)交互帶來的變化。 使用RESTful風(fēng)格的API,會從指定接口加載數(shù)據(jù)。每個(gè)接口都明確定義了返回的數(shù)據(jù)結(jié)構(gòu)。這意味著客戶端需要的數(shù)據(jù),已經(jīng)在URL中制定好了。GraphQL中采用的方式截然不同,GraphQL的API通常只暴露一個(gè)接口,而不是返回固定數(shù)據(jù)結(jié)構(gòu)的多個(gè)接口。 GraphQL返回的數(shù)據(jù)結(jié)構(gòu)不是一成不變的,而是靈活的,讓客戶端來決定真正需要的是什么數(shù)據(jù)。
這樣的變化能夠在一定程度上解決使用RESTful風(fēng)格接口完成數(shù)據(jù)交互時(shí)會遇到的問題:
多端點(diǎn),每個(gè)API都有自己的路徑需要管理
API數(shù)量龐大,新人自學(xué)習(xí)困難 GraphQL通過圖的方式來組織模型,結(jié)合GraphiQL,新人能夠快速上手
后端數(shù)據(jù)模型難以規(guī)范 RESTful接口多為頁面驅(qū)動,后端可能會設(shè)計(jì)很多差別不大的模型,目前并沒有一種強(qiáng)約束去要求后端開發(fā)人員規(guī)范模型,GraphQL要求在一開始就完成業(yè)務(wù)模型的分析和定義,避免后面業(yè)務(wù)模型的泛濫
在API設(shè)計(jì)時(shí)往往是面向頁面的,而頁面相比模型具有更差的穩(wěn)定性
API文檔維護(hù)工作量大 RESTful的API需要管理大量文檔,但是依然存在文檔更新、文檔查閱方便的問題,雖然可以動用人力完善工具去解決,但是GraphQL天然就自帶文檔工具特性。我們在定義字段時(shí),一并寫上description,通過GraphiQL可以實(shí)時(shí)查看:
type School {
id: ID!
# 學(xué)校id
schoolId: String
# 學(xué)校名稱
schoolName: String
# 學(xué)校年齡
schoolAge: Int
# 學(xué)校地址
schoolAddress: String
# 學(xué)校包含的老師
teachers: [Teacher]
# 校長
master: String
}
GraphiQL中查看:
6. 數(shù)據(jù)聚合較為麻煩 這是在后端經(jīng)常需要處理的問題,比如,客戶端需要一些數(shù)據(jù),我們定義了一個(gè)RESTful的接口,但是這些數(shù)據(jù)分別在A和B服務(wù)中,最終我們會在后臺手動聚合A和B的數(shù)據(jù)到一個(gè)模型里返回。而GraphQL通過不同的Resolver天然完成了數(shù)據(jù)聚合功能
GraphQL解除了接口和數(shù)據(jù)之間的綁定,對業(yè)務(wù)數(shù)據(jù)模型做了抽象和整理,以圖的方式來明確模型之間的關(guān)系,通過這些關(guān)系,具體業(yè)務(wù)場景可以定制自己的數(shù)據(jù),不同的業(yè)務(wù)場景只要基于同樣一套基礎(chǔ)數(shù)據(jù)模型就可以復(fù)用過往的接口。
以上好處講起來有些抽象,需要多多實(shí)踐多多體會。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/7355.html
摘要:關(guān)注業(yè)務(wù),而不是技術(shù)將數(shù)據(jù)需求放在它們所屬的客戶端。技術(shù)棧中的每一部分都起著作用技術(shù)棧中所有部分之間的協(xié)作可以借助緩存來完成。現(xiàn)在,我們來看看另一個(gè)貫穿整個(gè)技術(shù)棧的功能的例子。你可以認(rèn)為是首個(gè)內(nèi)置細(xì)粒度查看的技術(shù)。 本文整理自2017年 GraphQL 峰會上的演講,詳述緩存、追蹤、模式拼接和 GraphQL 未來發(fā)展等有關(guān)話題。 Facebook 開源 GraphQL 至今已兩年有余...
摘要:最終代碼省略其他輸入類型用標(biāo)識查詢類型需要至少定義一個(gè)不要會不顯示查詢這里需要轉(zhuǎn)成數(shù)組因?yàn)榍懊娑x了返回值是類型相當(dāng)于數(shù)據(jù)庫的添加操作相當(dāng)于數(shù)據(jù)庫的更新操作省略其他現(xiàn)在我們可以啟動服務(wù)器,在上測試下效果了。 showImg(https://segmentfault.com/img/remote/1460000019142304?w=893&h=438); 看完復(fù)聯(lián)四,我整理了這份 Gr...
摘要:如果你對這系列文章有疑問或發(fā)現(xiàn)有錯(cuò)誤的地方,歡迎在下方留言討論。 緊接上篇react+graphql起手和特性介紹(二),介紹完graphql與koa的服務(wù)搭建和graphql的一些常用特性,接下來我們介紹下在react中如何使用graphql我們使用create-react-app創(chuàng)建react應(yīng)用: npm i -g create-react-app mkdir react-gra...
摘要:包括什么把關(guān)于數(shù)據(jù)獲取的事情都接管過來,比如說請求異常,,請求排隊(duì),,獲取分頁數(shù)據(jù)。的聲明式數(shù)據(jù)獲取是按組織的,最好的方式也是把需要的數(shù)據(jù)寫在。另外,通過聲明式數(shù)據(jù)獲取還可以更好的對組件約束,只能獲取它聲明的數(shù)據(jù),并且也可以做些驗(yàn)證。 Facebook 在去年夏天公布了 GraphQL,就像往前端深潭砸下了一顆巨石,人們都被水聲吸引到了湖邊,觀望是否會出現(xiàn)什么,有些人期待,有些人猜疑。...
摘要:開發(fā)者體驗(yàn)可以幫助團(tuán)隊(duì)更快地實(shí)現(xiàn)功能上線,因?yàn)樗鼘﹂_發(fā)者的體驗(yàn)非常好。可以顯示每個(gè)的埋點(diǎn)指標(biāo),可以幫忙你定位錯(cuò)誤,可以分析中請求的每個(gè)字段的分布頻率。產(chǎn)品案例雖然規(guī)范是由在年公布的,但是自年以來,就是移動應(yīng)用開發(fā)的重要組成部分。 在大前端應(yīng)用的開發(fā)過程中,如何管理好數(shù)據(jù)是一件很有挑戰(zhàn)的事情。后端工程師需要聚合來自多個(gè)數(shù)據(jù)源的數(shù)據(jù),再分發(fā)到大前端的各個(gè)端中,而大前端工程師需要在實(shí)現(xiàn)用戶體...
閱讀 422·2019-08-29 12:44
閱讀 3001·2019-08-26 17:49
閱讀 2396·2019-08-26 13:40
閱讀 1180·2019-08-26 13:39
閱讀 3656·2019-08-26 11:59
閱讀 1814·2019-08-26 10:59
閱讀 2454·2019-08-23 18:33
閱讀 2687·2019-08-23 18:30