GraphQL的探索之路 – 一种为你的API而生的查询语言 - 第314篇
相關歷史文章(閱讀本文之前,您可能需要先看下之前的系列👇)
國內最全的Spring?Boot系列之三
Docker優雅的關閉SpringBoot?-?第310篇
「字節碼插樁」統計方法耗時(第一篇:初出茅廬)-?第311篇
「字節碼插樁」統計方法耗時(第二篇:嶄露頭角)-?第311篇
「字節碼插樁」統計方法耗時(第三篇:叱咤風云)- 第313篇
2020上半年發文匯總「值得收藏」
?
師傅:徒兒,這幾個星期,你找個技術點自我研究學習下。
悟纖:師傅,你這是拋棄徒兒了嘛?┭┮﹏┭┮
?
師傅:你又想哪里去了,這是訓練下你自我學習能力,再說了師傅也不能一直陪在你身邊呀,你總的學會自我成長呢。
?
悟纖:看來師傅是用心良苦吶,徒兒錯怪師傅了。師傅,徒兒這就去找個技術點研究下。?
說明
?????? 在接下來的文章主要介紹:
(1)GraphQL是什么?
(2)GraphQL在SpringBoot中如何集成?
?
一、GraphQL的官方介紹
?????? 我們進入GraphQL的官方文檔:https://graphql.cn ,可以看到一段話:
?
?????? 是不是看著感覺不知所云吶?那聽我慢慢道來。
?
二、GraphQL的探索之路
2.1 GraphQL的定義
?????? GraphQL 是一種 API 查詢語言, 用于服務器端執行按已定義類型系統的查詢. GraphQL 不與任何特定的數據庫或存儲引擎進行綁定, 而是由您的代碼和數據支持.(官方描述)。
?????? 上面這句話不好理解,看看下面這個解釋:
GraphQL 是一種針對 Graph(圖狀數據)進行查詢特別有優勢的 Query Language(查詢語言),所以叫做 GraphQL。
?????? 說白了就是想要什么, 就傳入什么字段, 也就會返回什么字段, 具體字段處理是服務器所提供, 而 graphql 并不會關心服務器怎么處理。
舉例說明:
傳統的rest api:
/user/{id}? return { id, name, age } 是一成不變的,
graphql:
findUser(id: xx)? return { id, name }? (注: 傳輸參數id, 指定返回字段 id, name, 當然也可以寫{ name, age },完全取決于前端需求 )
?????? 是不是還不懂,沒有關系,先接著往下看。
?
2.2 GraphQL的小歷史
?????? 早在2012年,Facebook認為人們只有在離開PC的時候才會用智能手機,很快他們就發現這個認識是多么的錯誤!于是Facebook把注意力從Web移到了智能終端上。在那個時候,他們嚴重的依賴于RESTful API。大量的并發請求和對補充數據的二次請求給他們造成了很大的麻煩,尤其是響應時間。一個解決方案是設計足夠多的資源來滿足單次的請求。但是,這造成了服務端的擴展和維護困難。
在尋找更好的解決方案的過程中,Facebook的工程師發現開發人員不應該先入為主的把數據看成RESTful一樣的集合。如何更好地存儲和獲取數據不應該是他們要主要考慮的內容。他們應該更多的考慮數據的關系,網狀的關系。
在這個情況下GraphQL應運而生。
?
2.3 GraphQL工作機制
?????? 一個GraphQL查詢可以包含一個或者多個操作(operation),類似于一個RESTful API。操作(operation)可以使兩種類型:查詢(Query)或者修改(mutation)。我們看一個例子:
query {findById(id: 1) {id name} }?????? 你的第一印象:“這個不是JSON?”。還真不是!就如我們之前說的,GraphQL設計的中心是為客戶端服務。GraphQL的設計者希望可以寫一個和期待的返回數據schema差不多的查詢。
注意上面的例子有三個不同的部分組成:
(1)findById是查詢的operation(這是一個Query)
(2)(id: 1) 包含了傳入給Query的參數(多個參數,使用逗號隔開,比如:(id:1,name:”張三”) )
(3)查詢包含id和name字段,這些字段也是我們希望查詢可以返回的。(這里就是GraphQL的特性,能夠指定要返回的字段,如果只指定了id,那么返回結果就只返回id。)
到這里是不是有點理解了GraphQL了,以前如果要返回不同的數據的話,需要編寫多個接口,或者編寫一個接口干脆什么字段都給返回給你,前端你自己就看著辦吧,要顯示哪些你就顯示哪些,不要顯示的,你就不要管了,4G時代,還什么流量問題,不用考慮。
我們看看server會給這個查詢返回什么:
{"data": {"findById": {"id": "1","name": "悟纖"}} }?????? 就如我們期望的,server會返回一個JSON串。這個JSON的schema和查詢的基本一致。
?????? 從以上的例子里你可以看出來GraphQL允許客戶端明確指定它要的是什么,避免了數據后去的冗余或者不足。和RESTful API對比一下,每一個客戶端都會對應很多個RESTful API或者一個API要服務很多個客戶端。所以說GraphQL是很好的查詢語言。所有的operation、參數和所有可以查詢的字段都需要在GraphQL server上定義、實現。
?
悟纖小結
悟纖:今天咱們就先探索到這里,知識需要慢慢消化,一口氣不能吃個胖子。
(1)GraphQL(Grapha Query Language):主要是作用于數據接口,比如前端后端交互,給客戶端篩選自由獲取服務端事先定義好的數據,提高了交互接口的靈活性。
(2)GraphQL官方說:GraphQL一種為你的API而生的查詢語言。
(3)API:應用編程接口,全稱是Application Programming Interface。
(4)GraphQL簡單理解:在請求API的時候,允許我們指定要返回的字段。
(5)GraphQL主要有兩種操作(Operation):查詢(Query)或者修改(mutation)。
?????? 到此你是不是還是有點小蒙圈,沒事,下節課我們會使用個小栗子來助你理解GraphQL。
?????? 學習完本文之后,記住以下這句話就足以了:
GraphQL解決了接口對查詢字段差異性的要求。
?
我就是我,是顏色不一樣的煙火。 我就是我,是與眾不同的小蘋果。?
學院中有Spring Boot相關的課程:
à悟空學院:https://t.cn/Rg3fKJD
SpringBoot視頻:http://t.cn/A6ZagYTi
Spring Cloud視頻:http://t.cn/A6ZagxSR
SpringBoot Shiro視頻:http://t.cn/A6Zag7IV
SpringBoot交流平臺:https://t.cn/R3QDhU0
SpringData和JPA視頻:http://t.cn/A6Zad1OH
SpringSecurity5.0視頻:http://t.cn/A6ZadMBe
Sharding-JDBC分庫分表實戰:http://t.cn/A6ZarrqS
分布式事務解決方案「手寫代碼」:http://t.cn/A6ZaBnIr
總結
以上是生活随笔為你收集整理的GraphQL的探索之路 – 一种为你的API而生的查询语言 - 第314篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sort在c语言中的作用,c语言中sor
- 下一篇: bzoj4084 [Sdoi2015]