【注】本文節譯自:GraphQL - Quick Guide (tutorialspoint.com)
GraphQL 是 Facebook 開發的一種開源伺服器端技術,用於最佳化 RESTful API 呼叫。它是一種執行引擎和一種資料查詢語言。在本章中,我們將討論使用 GraphQL 的優勢。
為什麼使用 GraphQL
RESTful API 遵循清晰且結構良好的面向資源的方法。但是,當資料變得更復雜時,路由會變得更長。有時無法透過單個請求獲取資料。這就是 GraphQL 派上用場的地方。GraphQL 以圖的形式構建資料,其強大的查詢語法用於遍歷、檢索和修改資料。
以下是使用 GraphQL 查詢語言的優勢:
詢問你想要的 - 並得到它
向您的 API 傳送 GraphQL 查詢並準確獲取您需要的內容。GraphQL 查詢總是返回可預測的結果。使用 GraphQL 的應用程式且穩定。與 Restful 服務不同,這些應用程式可以限制應該從伺服器獲取的資料。
以下示例將幫助您更好地理解這一點:
讓我們考慮一個具有屬性 id、firstName、lastName 和 CollegeName 的業務物件 Student。假設一個移動應用只需要獲取 firstName 和 id。 如果我們設計一個像 /api/v1/students 這樣的 REST 端點,它最終會為一個 Student 物件的所有欄位獲取資料。這意味著,資料被 RESTful 服務過度獲取。 這個問題可以透過使用 GraphQL 來解決。
考慮下面給出的 GraphQL 查詢:
{
{
id
firstName
}
}
這將僅返回 id 和 firstname 欄位的值。該查詢不會獲取學生物件的其他屬性的值。上面說明的查詢的響應如下所示:
{
"data": {
"students": [
{
"id": "S1001",
"firstName": "Mohtashim"
},
{
"id": "S1002",
"firstName": "Kannan"
}
]
}
}
在單個請求中獲取多個資源
GraphQL 查詢有助於順利檢索關聯的業務物件,而典型的 REST API 需要從多個 URL 載入。GraphQL API 在單個請求中獲取您的應用程式所需的所有資料。即使在緩慢的行動網路連線上,使用 GraphQL 的應用程式也可以很快。
讓我們再考慮一個業務物件 College,它具有以下屬性:名稱和位置。 Student 業務物件與 College 物件具有關聯關係。如果我們使用 REST API 來獲取學生及其大學的詳細資訊,我們最終將向伺服器發出兩個請求,如 /api/v1/students 和 /api/v1/colleges。這將導致每個請求的資料獲取不足。 因此,移動應用被迫多次呼叫伺服器以獲取所需的資料。
但是,移動應用可以使用 GraphQL 在單個請求中獲取 Student 和 College 物件的詳細資訊。
以下是用於獲取資料的 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 還提供了客戶端庫,可以幫助減少顯式資料轉換和解析。
下面給出了 Student 和 College 資料型別的示例:
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 和智慧程式碼完成功能。