1. 程式人生 > >使用ASP.NET Core開發GraphQL伺服器 -- 預備知識(上)

使用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+空格也會彈出瀏覽器的選單