

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# GraphQL 中的标量类型
<a name="scalars"></a>

GraphQL 对象类型具有名称和字段，并且这些字段可以具有子字段。最终，对象类型的字段必须解析为*标量*类型，这些类型表示查询的叶节点。有关对象类型和标量的更多信息，请参阅 GraphQL 网站上的 [Schemas and types](https://graphql.org/learn/schema/)。

除了默认 GraphQL 标量集以外，AWS AppSync 还允许您使用以 *AWS* 前缀开头的**服务定义的标量**。AWS AppSync 不支持创建**用户定义的**（自定义）标量。您必须使用默认标量或 *AWS* 标量。

您不能将 *AWS* 作为自定义对象类型的前缀。

下一节是架构类型参考。

## 默认标量
<a name="graph-ql-base-scalars"></a>

GraphQL 定义了以下默认标量：

### 默认标量列表
<a name="graph-ql-base-scalars-list"></a>

`ID`  
对象的唯一标识符。该标量像 `String` 一样序列化，但并不意味着用户可读。

`String`  
UTF-8 字符序列。

`Int`  
-(231) 和 231-1 之间的整数值。

`Float`  
IEEE 754 浮点值。

`Boolean`  
一个布尔值，可以是 `true` 或 `false`。

## AWS AppSync 标量
<a name="graph-ql-aws-appsync-scalars"></a>

AWS AppSync 定义了以下标量：

### AWS AppSync 标量列表
<a name="graph-ql-aws-appsync-scalars-list"></a>

`AWSDate`  
格式为 `YYYY-MM-DD` 的扩展 [ISO 8601 日期](https://en.wikipedia.org/wiki/ISO_8601#Calendar_dates)字符串。

`AWSTime`  
格式为 `hh:mm:ss.sss` 的扩展 [ISO 8601 时间](https://en.wikipedia.org/wiki/ISO_8601#Times)字符串。

`AWSDateTime`  
格式为 `YYYY-MM-DDThh:mm:ss.sssZ` 的扩展 [ISO 8601 日期和时间](https://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations)字符串。

**注意**  
`AWSDate`、`AWSTime` 和 `AWSDateTime` 标量可以选择包含[时区偏移](https://en.wikipedia.org/wiki/ISO_8601#Time_zone_designators)。例如，值 `1970-01-01Z`、`1970-01-01-07:00` 和 `1970-01-01+05:30` 对于 `AWSDate` 均有效。时区偏移必须是 `Z` (UTC) 或以小时和分钟以及秒（可选）为单位的偏移。例如 `±hh:mm:ss`。时区偏移中的秒字段被认为有效，即使它不是 ISO 8601 标准的一部分。

`AWSTimestamp`  
表示 `1970-01-01-T00:00Z` 之前或之后的秒数的整数值。

`AWSEmail`  
采用 [RFC 822](https://tools.ietf.org/html/rfc822) 定义的格式 `local-part@domain-part` 的电子邮件地址。

`AWSJSON`  
JSON 字符串。任何有效的 JSON 构造自动作为映射、列表或标量值解析并加载到解析器代码中，而不是作为文本输入字符串。不带引号的字符串或其他无效的 JSON 将导致 GraphQL 验证错误。

`AWSPhone`  
电话号码。该值存储为字符串。电话号码可以包含空格或连字符以分隔数字组。没有国家/地区代码的电话号码假定为符合[北美编号计划 (NANP)](https://en.wikipedia.org/wiki/North_American_Numbering_Plan) 的美国/北美号码。

`AWSURL`  
[RFC 1738](https://tools.ietf.org/html/rfc1738) 定义的 URL。例如，`https://www.amazon.com/dp/B000NZW3KC/` 或 `mailto:example@example.com`。URL 必须包含模式（`http`、`mailto`），并且不能在路径部分中包含两个正斜杠 (`//`)。

`AWSIPAddress`  
有效的 IPv4 或 IPv6 地址。IPv4 地址应采用四点表示法 (`123.12.34.56`)。IPv6 地址应采用以冒号分隔的无括号格式 (`1a2b:3c4b::1234:4567`)。您可以包含可选的 CIDR 后缀 (`123.45.67.89/16`) 以指示子网掩码。

## 架构用法示例
<a name="example-schema-usage"></a>

以下示例 GraphQL 架构将所有自定义标量作为“对象”，并显示基本 put、get 和 list 操作的解析器请求和响应模板。最后，该示例说明了在运行查询和变更时如何使用该架构。

```
type Mutation {
    putObject(
        email: AWSEmail,
        json: AWSJSON,
        date: AWSDate,
        time: AWSTime,
        datetime: AWSDateTime,
        timestamp: AWSTimestamp,
        url: AWSURL,
        phoneno: AWSPhone,
        ip: AWSIPAddress
    ): Object
}

type Object {
    id: ID!
    email: AWSEmail
    json: AWSJSON
    date: AWSDate
    time: AWSTime
    datetime: AWSDateTime
    timestamp: AWSTimestamp
    url: AWSURL
    phoneno: AWSPhone
    ip: AWSIPAddress
}

type Query {
    getObject(id: ID!): Object
    listObjects: [Object]
}

schema {
    query: Query
    mutation: Mutation
}
```

`putObject` 的请求模板可能如下所示。`putObject` 使用 `PutItem` 操作在 Amazon DynamoDB 表中创建或更新项目。请注意，该代码片段没有配置 Amazon DynamoDB 表以作为数据来源。这仅用作一个示例：

```
{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key" : {
        "id": $util.dynamodb.toDynamoDBJson($util.autoId()),
    },
    "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args)
}
```

`putObject` 的响应模板返回以下结果：

```
$util.toJson($ctx.result)
```

`getObject` 的请求模板可能如下所示。`getObject` 使用 `GetItem` 操作为给定主键的项目返回一组属性。请注意，该代码片段没有配置 Amazon DynamoDB 表以作为数据来源。这仅用作一个示例：

```
{
    "version": "2017-02-28",
    "operation": "GetItem",
    "key": {
        "id": $util.dynamodb.toDynamoDBJson($ctx.args.id),
    }
}
```

`getObject` 的响应模板返回以下结果：

```
$util.toJson($ctx.result)
```

`listObjects` 的请求模板可能如下所示。`listObjects` 使用 `Scan` 操作返回一个或多个项目和属性。请注意，该代码片段没有配置 Amazon DynamoDB 表以作为数据来源。这仅用作一个示例：

```
{
    "version" : "2017-02-28",
    "operation" : "Scan",
}
```

`listObjects` 的响应模板返回以下结果：

```
$util.toJson($ctx.result.items)
```

以下是将该架构与 GraphQL 查询一起使用的一些示例：

```
mutation CreateObject {
    putObject(email: "example@example.com"
        json: "{\"a\":1, \"b\":3, \"string\": 234}"
        date: "1970-01-01Z"
        time: "12:00:34."
        datetime: "1930-01-01T16:00:00-07:00"
        timestamp: -123123
        url:"https://amazon.com"
        phoneno: "+1 555 764 4377"
        ip: "127.0.0.1/8"
    ) {
        id
        email
        json
        date
        time
        datetime
        url
        timestamp
        phoneno
        ip
    }
}

query getObject {
    getObject(id:"0d97daf0-48e6-4ffc-8d48-0537e8a843d2"){
        email
        url
        timestamp
        phoneno
        ip
    }
}

query listObjects {
    listObjects {
        json
        date
        time
        datetime
    }
}
```