本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
GraphQL 的其他屬性
GraphQL 由數個設計原則組成,以大規模維持簡易性和穩健性。
宣告式
GraphQL 是宣告性的,這表示使用者只會宣告要查詢的欄位,藉此描述 (塑造) 資料。回應只會傳回這些屬性的資料。例如,以下操作會擷取 DynamoDB 資料表中 13 ISBN id
值為 的Book
物件 9780199536061
:
{ getBook(id: "
9780199536061
") { name year author } }
回應會傳回承載 (name
、 year
和 author
) 中的欄位,而不會傳回其他欄位:
{ "data": { "getBook": { "name": "Anna Karenina", "year": "1878", "author": "Leo Tolstoy", } } }
由於此設計原則,GraphQL 可消除在複雜系統中過度擷取和擷取不足RESTAPIs所處理的長期問題。這會導致更有效率的資料收集並改善網路效能。
階層
GraphQL 具有彈性,因為請求的資料可由使用者調整,以符合應用程式的需求。請求的資料一律遵循 GraphQL 中定義的屬性類型和語法API。例如,下列程式碼片段會顯示名為 的新欄位範圍getBook
的操作quotes
,該範圍會傳回所有儲存的引號字串和連結至 的頁面 Book
9780199536061
:
{ getBook(id: "
9780199536061
") { name year author quotes { description page } } }
執行此查詢會傳回下列結果:
{ "data": { "getBook": { "name": "Anna Karenina", "year": "1878", "author": "Leo Tolstoy", "quotes": [ { "description": "The highest Petersburg society is essentially one: in it everyone knows everyone else, everyone even visits everyone else.", "page": 135 }, { "description": "Happy families are all alike; every unhappy family is unhappy in its own way.", "page": 1 }, { "description": "To Konstantin, the peasant was simply the chief partner in their common labor.", "page": 251 } ] } } }
如您所見,連結至所請求書籍quotes
的欄位以 陣列的形式傳回,格式與我們的查詢所述的格式相同。雖然此處未顯示,但 GraphQL 具有額外的優勢,即不特別說明正在擷取的資料的位置。 Books
和 quotes
可以分開存放,但只要關聯存在,GraphQL 仍會擷取資訊。這表示您的查詢可以在單一請求中擷取多個獨立資料。
隱含性
GraphQL 是自我記錄或自我介紹。它支援數個內建操作,可讓使用者檢視結構描述中的基礎類型和欄位。例如,以下Foo
類型具有 date
和 description
欄位:
type Foo { date: String description: String }
我們可以使用 _type
操作來尋找結構描述下方的輸入中繼資料:
{ __type(name: "Foo") { name # returns the name of the type fields { # returns all fields in the type name # returns the name of each field type { # returns all types for each field name # returns the scalar type } } } }
這將傳回回應:
{ "__type": { "name": "Foo", # The type name "fields": [ { "name": "date", # The date field "type": { "name": "String" } # The date's type }, { "name": "description", # The description field "type": { "name": "String" } # The description's type }, ] } }
此功能可用來了解特定 GraphQL 結構描述支援的類型和欄位。GraphQL 支援各種這些介紹性操作。如需詳細資訊,請參閱 Introspection
強式輸入
GraphQL 支援透過其類型和欄位系統進行強式輸入。當您在結構描述中定義某個項目時,它必須具有可在執行時間之前驗證的類型。它還必須遵守 GraphQL 的語法規格。此概念與其他語言的程式設計沒有不同。例如,以下是稍早的Foo
類型:
type Foo { date: String description: String }
我們可以看到, Foo
是將要建立的物件。在 執行個體中Foo
,將會有一個 String
date
和 description
欄位,這兩個基本類型 (純量)。總而言之,我們看到 Foo
已宣告,且其欄位存在於其範圍內。這種類型檢查和邏輯語法的組合可確保 GraphQL API 簡潔且自我明顯。您可以在此處找到 GraphQL 的輸入和語法規格。 https://spec.graphql.org/