Schemas and Types
認識 GraphQL 型別系統的各種元素
GraphQL 的型別系統描述了 API 可以查詢哪些資料。這些能力的集合稱為服務的 schema(綱要),前端可以利用這個 schema 向 API 發送查詢,並獲得可預期的結果。
本頁會帶你探索 GraphQL 的六種命名類型定義以及型別系統的其他功能,學習如何用它們描述資料與資料之間的關聯。由於 GraphQL 可以搭配任何後端框架或程式語言使用,這裡我們會避免討論實作細節,專注於概念說明。
型別系統
如果你看過 GraphQL 查詢語言,你會發現它基本上就是在物件上選取欄位。例如,以下這個查詢:
# { "graphiql": true }
{
hero {
name
appearsIn
}
}
- 我們從一個特殊的「根」物件開始
- 在這個物件上選取
hero
欄位 - 對
hero
回傳的物件,再選取name
和appearsIn
欄位
因為 GraphQL 查詢的結構和回傳結果非常接近,所以即使不太了解伺服器,也能預測查詢會得到什麼資料。不過,能夠明確描述可查詢的資料會更有幫助。例如:可以選哪些欄位?這些欄位會回傳什麼型別的物件?子物件又有哪些欄位?
這就是 schema 的用途。每個 GraphQL 服務都會定義一組型別,完整描述這個服務可以查詢的所有資料。當收到查詢請求時,系統會根據這個 schema 進行驗證與執行。
型別語言(Type language)
GraphQL 服務可以用任何語言實作,定義 schema 型別時也有多種方式:
- 有些函式庫會讓你用同一種程式語言同時定義 schema 型別、欄位與 resolver(解析函式)。
- 有些函式庫則提供所謂的 schema 定義語言(SDL),讓你用更直覺的方式定義型別與欄位,再分開撰寫 resolver。
- 有些函式庫甚至可以直接從 resolver 推斷出 schema。
- 也有函式庫能根據底層資料來源自動推斷型別與 resolver。
因為這份教學不侷限於特定語言,我們會用 SDL 來說明,因為它和查詢語言很像,也方便用語言無關的方式討論 GraphQL schema。