使用ASP.NET Core開發GraphQL伺服器 -- 預備知識(上)
為了介紹使用ASP.NET Core構建GraphQL伺服器,本文需要介紹一下GraphQL,其實看官網的文件就行。
什麼是GraphQL?
GraphQL 既是一種用於 API 的查詢語言也是一個滿足你資料查詢的執行時。 GraphQL 對你的 API 中的資料提供了一套易於理解的完整描述,使得客戶端能夠準確地獲得它需要的資料,而且沒有任何冗餘,也讓 API 更容易地隨著時間推移而演進,還能用於構建強大的開發者工具。
GraphQL來自Facebook,它於2012年開始開發,2015年開源。
GraphQL與程式語言無關,可以使用很多種語言/框架來構建Graph 伺服器,包括.NET Core。
像Github,Pinterest,Coursera等公司都在使用GraphQL。
Github的API到目前有4個版本,第三個版本都是用的是REST,而第四個版本使用的是GraphQL。
GraphQL到底是什麼?
這就是一個GraphQL查詢的例子。左邊是查詢,右邊是結果。
從這個例子可以看出,查詢是可以巢狀的,所以使用GraphQL的客戶端可以通過一次請求獲得所有需要的資料。
每當對GraphQL伺服器進行查詢的時候,這些查詢首先都會依據一個型別系統對其進行驗證。每個GraphQL服務都會在GraphQL schema裡定義型別資訊。
可以把這個型別系統看作是你的API資料的藍本,它由你定義的一系列物件所支撐。
例如這個User物件:
GraphQL經常被稱作是一個:宣告式資料獲取語言。
GraphQL的設計原則
- 分層結構:GraphQL的查詢是有層次結構的,欄位可以內嵌其它欄位;查詢和返回資料的結構是一致的。
- 以產品中心:GraphQL是由客戶端所需要的資料所驅動,語言和執行時也支援客戶端。
- 強型別:GraphQL伺服器由GraphQL型別系統所支撐。在schema裡,每個資料點都有一個特定的型別,針對這個型別還有驗證。
- 客戶端定製查詢:GraphQL伺服器提供了可以讓客戶端進行定製查詢的能力。
- 內省(introspective):客戶端可以查詢GraphQL伺服器的型別系(schema)。
為什麼使用GraphQL?
談起GraphQL,總是離不開REST。
REST有幾個問題:
過度獲取:REST裡GET請求的查詢結果通常比較大,並且超過了客戶端的需求:
這裡我只需要name,height,和mass,但是卻返回了所有的欄位。
而使用GraphQL,我只需要查詢我需要的資料:
獲取不足:使用REST時,我想獲取部門和部門的人員,通常我需要先請求查詢部門列表;然後遍歷返回的部門列表,再次發出請求查詢每個部門下的人員,所以是N+1查詢。
而使用GraphQL,我就可以通過一個查詢請求(巢狀的)取得相應的結果。
不靈活:隨著API的演進,REST需要隨時建立新的端點,所以REST API的端點增長速度很快;此外有版本和相容性需要謹慎考慮。
而GraphQL,典型的結構是隻有一個端點。這個單端點就像API閘道器一樣組織了多個數據源,這樣就會更簡單。
綜上,使用GraphQL的好處是:
- 避免多重REST請求
- 向下相容,無需考慮版本
- 可以對現有的資料來源(例如REST API)進行包裝
- 與開發語言無關
GraphQL查詢
登入之後,其效果如下:
Github使用了graphiql,graphiql是一個瀏覽器內的IDE,它可以用來瀏覽和查詢GraphQL。
下一篇文章,我也會在.NET專案裡安裝這個graphiql。
graphiql只是用來瀏覽查詢GraphQL的一個瀏覽工具而已,其它比較流行的工具還包括GraphQL Playground 和 GraphQL Voyager等。
第一個查詢
開啟Github的GraphiQL以後,自動載入了一個查詢語句,我們點選執行按鈕,右側就會返回查詢的結果:
在這裡,我查詢了瀏覽者 viewer這個欄位,當前瀏覽該網頁的就是我自己;在查詢裡我還包括了viewer下的login欄位,也就是登入名。
結果以JSON形式返回,其資料包含在data屬性下,結構和查詢結構一致。
如果我還想在查詢中包含瀏覽者的姓名,那就加一個欄位即可:
GraphQL的查詢也可以有註釋:
GraphiQL的智慧提示
GraphiQL是具有智慧提示的功能的。當你輸入一個字母之後,就是這種效果:
如果你什麼都不輸入,還想知道有哪些欄位,那麼就按Alt+空格:
但是在windows上多少還是有些問題的,因為Alt+空格也會彈出瀏覽器的選單