- GraphQL 教程
- GraphQL - 首頁
- GraphQL - 簡介
- GraphQL - 環境搭建
- GraphQL - 架構
- GraphQL - 應用元件
- GraphQL - 例子
- GraphQL - 型別系統
- GraphQL - 模式
- GraphQL - 解析器
- GraphQL - 查詢
- GraphQL - 變異
- GraphQL - 驗證
- GraphQL - JQuery 整合
- GraphQL - React 整合
- GraphQL - Apollo Client
- GraphQL - 客戶端認證
- GraphQL - 快取
- GraphQL 有用資源
- GraphQL - 快速指南
- GraphQL - 有用資源
- GraphQL - 討論
GraphQL - 簡介
GraphQL 是一種由 Facebook 開發的開源伺服器端技術,用於最佳化 RESTful API 呼叫。它是一個執行引擎和資料查詢語言。本章我們將討論使用 GraphQL 的優勢。
為什麼選擇 GraphQL
RESTful API 遵循清晰且結構良好的資源導向方法。但是,當資料變得更復雜時,路由會變得更長。有時無法透過單個請求獲取資料。這就是 GraphQL 發揮作用的地方。GraphQL 以圖形的形式構建資料,並具有強大的查詢語法,用於遍歷、檢索和修改資料。
以下是使用 GraphQL 查詢語言的優勢:
索取所需內容 - 並獲取它
向您的 API 傳送 GraphQL 查詢,並準確獲取所需內容。GraphQL 查詢始終返回可預測的結果。使用 GraphQL 的應用程式快速且穩定。與 RESTful 服務不同,這些應用程式可以限制應從伺服器獲取的資料。
以下示例將幫助您更好地理解這一點:
讓我們考慮一個具有屬性 `id`、`firstName`、`lastName` 和 `collegeName` 的業務物件 *學生*。假設一個移動應用程式只需要獲取 `firstName` 和 `id`。如果我們設計一個像 `/api/v1/students` 這樣的 REST 端點,它最終會為 *學生* 物件的所有欄位獲取資料。這意味著 RESTful 服務過度獲取了資料。這個問題可以使用 GraphQL 來解決。
考慮以下 GraphQL 查詢:
{
students {
id
firstName
}
}
這將僅返回 `id` 和 `firstname` 欄位的值。查詢不會為學生物件的其它屬性獲取值。上面所示查詢的響應如下所示:
{
"data": {
"students": [
{
"id": "S1001",
"firstName": "Mohtashim"
},
{
"id": "S1002",
"firstName": "Kannan"
}
]
}
}
單個請求獲取多個資源
GraphQL 查詢有助於平滑地檢索關聯的業務物件,而典型的 REST API 需要從多個 URL 載入。GraphQL API 在單個請求中獲取應用程式所需的所有資料。即使在緩慢的行動網路連線上,使用 GraphQL 的應用程式也可以很快。
讓我們再考慮一個業務物件 *學院*,它具有屬性:名稱和位置。*學生* 業務物件與學院物件具有關聯關係。如果我們使用 REST API 來獲取學生及其學院的詳細資訊,我們將最終向伺服器發出兩個請求,例如 `/api/v1/students` 和 `/api/v1/colleges`。這將導致每次請求都欠缺資料。因此,移動應用程式被迫向伺服器發出多次呼叫以獲取所需的資料。
但是,移動應用程式可以使用 GraphQL 在單個請求中獲取學生和學院物件的詳細資訊。
以下是一個用於獲取資料的 GraphQL 查詢:
{
students{
id
firstName
lastName
college{
name
location
}
}
}
上述查詢的輸出包含我們請求的那些欄位,如下所示:
{
"data": {
"students": [
{
"id": "S1001",
"firstName": "Mohtashim",
"lastName": "Mohammad",
"college": {
"name": "CUSAT",
"location": "Kerala"
}
},
{
"id": "S1002",
"firstName": "Kannan",
"lastName": "Sudhakaran",
"college": {
"name": "AMU",
"location": "Uttar Pradesh"
}
},
{
"id": "S1003",
"firstName": "Kiran",
"lastName": "Panigrahi",
"college": {
"name": "AMU",
"location": "Uttar Pradesh"
}
}
]
}
}
使用型別系統描述可能性
GraphQL 是強型別的,查詢基於欄位及其關聯的資料型別。如果 GraphQL 查詢中存在型別不匹配,伺服器應用程式將返回清晰且有用的錯誤訊息。這有助於客戶端應用程式平滑地除錯和輕鬆檢測錯誤。GraphQL 還提供客戶端庫,可以幫助減少顯式資料轉換和解析。
以下是 *學生* 和 *學院* 資料型別的示例:
type Query {
students:[Student]
}
type Student {
id:ID!
firstName:String
lastName:String
fullName:String
college:College
}
type College {
id:ID!
name:String
location:String
rating:Float
students:[Student]
}
使用強大的開發者工具更快地開發
GraphQL 提供豐富的開發者工具來編寫文件和測試查詢。GraphiQL 是一個優秀的工具,它生成查詢及其模式的文件。它還提供查詢編輯器來測試 GraphQL API,並在構建查詢時提供智慧程式碼補全功能。