Graphql學習(一)-GraphQL介紹
這一篇簡單介紹一下GraphQL的概念及可以幫助我們解決什麼問題,並有什麼優勢
GraphQL:既是一種用於 API 的查詢語言也是一個滿足你資料查詢的執行時。 GraphQL 對你的 API 中的資料提供了一套易於理解的完整描述,使得客戶端能夠準確地獲得它需要的資料,而且沒有任何冗餘,也讓 API 更容易地隨著時間推移而演進,還能用於構建強大的開發者工具。
以上內容摘抄自官網。簡單說一下我的理解:可以說是Web服務的一種新的架構和規範,並且在FaceBook、gitHub、Twitter中均已使用。對比現在業務使用的Restful來說,有下列優勢:
- 單endpoint:一個請求獲取所有資料,解決RestAPI多個請求獲取資源的問題
- 清晰的資料模型,欄位強型別
- 按需獲取,減少網路請求,無冗餘
- API迭代順暢,無須版本化
- 協議而非儲存,對服務端資料進行組裝過濾
Rest比較
- 資料獲取:Rest缺乏擴充套件性,GraphQL獲取時,payload可以擴充套件,按需獲取
- API呼叫:Rest有多個endpoint,GraphQL在大多數情況下只有1個endpoint,只是body內容不同
- 複雜請求:Rest需要多次,GraphQL一次呼叫,減少網路開銷
- 返回處理:Rest有多種httpCode及Status,GraphQL只有200響應,錯誤內容需要在結果集中特殊獲取
- 版本號:Rest使用V1、V2,GraphQL可根據Schema自行擴充套件
可以看出,GraphQL對前端開發來說幫助巨大,減少了很多工作量。但為了配合使用,伺服器端需要怎麼協同,並有什麼好處呢?簡單看了幾個例子後發現,後端如果使用Graphql重構,就相當於服務層做了一層使用GraphQL引擎對已獲取的結果資料再做一次包裝。
自己的理解
- 可以預見,服務端在改造時,資料獲取層不會有太大的工作量,但由於只有一個endpoint,在業務邏輯層可能需要拼接原來多個介面返回的資料。比如個人主頁的訪問,原本需要a請求返回個人資訊,b請求返回朋友關係。在GraphQL的架構中,需要將a、b請求的資料在服務端合併,並使用GaphQL引擎構建執行時,對外提供介面c。這樣就意味著c介面需要承擔a、b兩個請求的查詢量,效能方面是否會有瓶頸?
- 其次,對於資料模型的定義務必精確,哪些欄位可以被查詢,哪些需要有請求引數,還有分頁等都需要考慮。
- 對於資料校驗、使用者許可權及資料安全性來說解決方案也比較模糊。因為整體的請求返回需要GraphQL引擎來處理,所以原本一些過濾器攔截器的方案可能被替代,需要業務層來完整處理應對。
- GraphQL-Java的文件較少,而且官網上的一些demo也無法執行,前期調研成本較大
總結
通過對官網的瀏覽,對後端來說,並沒有覺得有什麼很明顯的優勢。但對前端或者整個專案來說,提升還是挺明顯的,具體效果等實際應用了以後再看吧。後面幾章會介紹一下GraphQL的語法,並使用GraphQL-java做一些伺服器端的Demo及資料模型的建立。
參考
相關文章
- 專案學習Graphql(一)
- GraphQL學習:Github GraphQL API v4初探GithubAPI
- 【.NET 遇上 GraphQL】 ChilliCream 平臺介紹
- 2019 GraphQL學習指南
- GraphQL 漸進學習 05-graphql-resolvers-union-聯合的使用
- 結合 Laravel 初步學習 GraphQLLaravel
- GraphQL 入門簡介
- GraphQL 漸進學習 09-graphql-apollo-client-vue-客戶端開發clientVue客戶端
- 利用SkyWalking UI的api介面學習GraphQLUIAPI
- GraphQL 快速入門【5】GraphQL 示例
- GraphQL 快速入門【1】簡介
- 【譯】GraphQL 初學者指南
- GraphQL案例演示
- GraphQL入門
- GraphQL & Relay 初探
- Graphql 調研
- Flutter x GraphQLFlutter
- 《GraphQL 名詞 101:解析 GraphQL 的查詢語法》【譯】
- GraphQL初體驗,Node.js構建GraphQL API指南Node.jsAPI
- GraphQL & Relay 實戰
- Vue + GraphQL初試Vue
- rails graphql的使用AI
- GraphQL入門:GraphQL與REST區別的不同舉例 - SithiraREST
- graphql-normalizr: 儲存規範化GraphQL響應資料ORM
- 【譯】GraphQL vs. RESTREST
- GraphQL —— 標量型別型別
- GraphQL 技術淺析
- React+GraphQL入門React
- GraphQL 基礎實踐
- GraphQL分享理論篇
- GraphQL API vs REST APIAPIREST
- 基於 GraphQL 實踐的一點思考
- [譯]GraphQL如何把查詢轉換為響應(How GraphQL turns a query into a response)
- GraphQL-Go-onepieceAPI:用Go語言和GraphQL開發的海賊王APIGoAPI
- (一) 機器學習和機器學習介紹機器學習
- 前端應該知道的GraphQL前端
- Go 語言實戰 GraphQLGo
- 造輪子之整合GraphQL