

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# GraphQL 的其他屬性
<a name="graphql-properties"></a>

GraphQL 包含數個設計原則，可大規模維持簡單性和穩健性。

## 宣告式
<a name="declarative-property"></a>

GraphQL 是宣告式，這表示使用者只需宣告要查詢的欄位，即可描述 （塑造） 資料。回應只會傳回這些屬性的資料。例如，以下操作會擷取 DynamoDB 資料表中 ISBN 13 `id`值為 *9780199536061* 的`Book`物件：

```
{
  getBook(id: "9780199536061") {
    name
    year
    author
  }
}
```

回應將傳回承載 (`name`、 `year`和 `author`) 中的欄位，而不會傳回其他欄位：

```
{
  "data": {
    "getBook": {
      "name": "Anna Karenina",
      "year": "1878",
      "author": "Leo Tolstoy",
    }
  }
}
```

由於此設計原則，GraphQL 消除了 REST APIs 在複雜系統中處理過度和擷取不足的常年問題。這會導致更有效率的資料收集並改善網路效能。

## 階層
<a name="hierarchical-property"></a>

GraphQL 具有彈性，因為請求的資料可由使用者塑造以符合應用程式的需求。請求的資料一律遵循 GraphQL API 中定義的屬性類型和語法。例如，以下程式碼片段顯示名為 的新欄位範圍`getBook`操作`quotes`，其會傳回所有已存放的引號字串和連結至 *9780199536061* `Book` 的頁面：

```
{
  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 仍會擷取資訊。這表示您的查詢可以在單一請求中擷取多個獨立資料。

## 自我介紹
<a name="introspective-property"></a>

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 支援各種這些自我檢查操作。如需詳細資訊，請參閱[自我檢查](https://graphql.org/learn/introspection/)。

## 強式輸入
<a name="strong-typing-property"></a>

GraphQL 透過其類型和欄位系統支援強式輸入。當您在結構描述中定義某個項目時，它必須具有可在執行時間之前驗證的類型。它還必須遵循 GraphQL 的語法規格。此概念與其他語言的程式設計並無不同。例如，以下是先前 的`Foo`類型：

```
type Foo {
	date: String
	description: String
}
```

我們可以看到 `Foo`是將要建立的物件。在 執行個體中`Foo`，將會有一個 `date`和 `description` 欄位，兩者都是基本類型 `String` （純量）。總而言之，我們看到 `Foo`已宣告，且其欄位存在於其範圍內。這種類型檢查和邏輯語法的組合可確保您的 GraphQL API 簡潔且自我明顯。您可以在[此處](https://spec.graphql.org/)找到 GraphQL 的輸入和語法規格。