本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
GraphQL 中的标量类型
GraphQL 对象类型具有名称和字段,并且这些字段可以具有子字段。最终,对象类型的字段必须解析为标量类型,这些类型表示查询的叶节点。有关对象类型和标量的更多信息,请参阅 GraphQL 网站上的 Schemas and types
除了默认的 GraphQL 标量集外, Amazon AppSync 还允许您使用以前缀开头的服务定义标量。Amazon Amazon AppSync 不支持创建用户定义的(自定义)标量。您必须使用默认标量或 Amazon 标量。
您不能将 Amazon 作为自定义对象类型的前缀。
下一节是架构类型参考。
默认标量
GraphQL 定义了以下默认标量:
ID
-
对象的唯一标识符。该标量像
String
一样序列化,但并不意味着用户可读。 String
-
UTF-8 字符序列。
Int
-
-(231) 和 231-1 之间的整数值。
Float
-
IEEE 754 浮点值。
Boolean
-
一个布尔值,可以是
true
或false
。
Amazon AppSync 标量
Amazon AppSync 定义以下标量:
AWSDate
-
格式为
YYYY-MM-DD
的扩展 ISO 8601 日期字符串。 AWSTime
-
格式为
hh:mm:ss.sss
的扩展 ISO 8601 时间字符串。 AWSDateTime
-
格式为
YYYY-MM-DDThh:mm:ss.sssZ
的扩展 ISO 8601 日期和时间字符串。
注意
AWSDate
、AWSTime
和 AWSDateTime
标量可以选择包含时区偏移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
定义的格式 local-part@domain-part
的电子邮件地址。 AWSJSON
-
JSON 字符串。任何有效的 JSON 构造自动作为映射、列表或标量值解析并加载到解析器代码中,而不是作为文本输入字符串。不带引号的字符串或其他无效的 JSON 将导致 GraphQL 验证错误。
AWSPhone
-
电话号码。该值存储为字符串。电话号码可以包含空格或连字符以分隔数字组。没有国家/地区代码的电话号码假定为符合北美编号计划 (NANP)
的美国/北美号码。 AWSURL
-
RFC 1738
定义的 URL。例如, https://www.amazon.com/dp/B000NZW3KC/
或mailto:example@example.com
。 URLs必须包含架构 (http
,mailto
),并且路径部分不能包含两个正斜杠 (//
)。 AWSIPAddress
-
有效的 O IPv4 R IPv6 地址。 IPv4 地址应使用四点符号 ()。
123.12.34.56
IPv6 地址应采用非方括号、冒号分隔的格式 ()。1a2b:3c4b::1234:4567
您可以包含可选的 CIDR 后缀 (123.45.67.89/16
) 以指示子网掩码。
架构用法示例
以下示例 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 } }