本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
GraphQL 架构
GraphQL 架构是 GraphQL 的基础。API它充当定义数据形状的蓝图。它也是客户端和服务器之间的合约,用于定义如何检索和/或修改您的数据。
GraphQL 架构是用架构定义语言 () 编写的。SDLSDL由具有既定结构的类型和字段组成:
-
类型:类型是 GraphQL 定义数据形状和行为的方式。GraphQL 支持多种类型,本节后面将介绍这些类型。架构中定义的每种类型将包含自己的范围。在该范围内具有一个或多个字段,这些字段可以包含在 GraphQL 服务中使用的值或逻辑。类型扮演很多不同的角色,最常见的角色是对象或标量(基元值类型)。
-
字段:字段位于类型范围内,并保存从 GraphQL 服务中请求的值。它们与其他编程语言中的变量非常相似。您在字段中定义的数据的形状决定了如何在请求/响应操作中设置数据结构。这样,开发人员就可以在不知道服务后端实施方式的情况下预测返回的内容。
为了直观地了解架构的外观,让我们看一个简单 GraphQL 架构的内容。在生产代码中,您的架构通常位于名为 schema.graphql
或 schema.json
的文件中。假设我们正在研究一个实施 GraphQL 服务的项目。该项目存储公司人员数据,并使用 schema.graphql
文件检索人员数据以及在数据库中添加新人员。代码可能如下所示:
我们可以看到在架构中定义了三种类型:Person
、Query
和 Mutation
。看一下 Person
,我们可以猜到这是公司员工实例的蓝图,这会使该类型成为一个对象。在其范围内,我们看到 id
、name
和 age
。这些是定义 Person
属性的字段。这意味着我们的数据来源将每个 Person
的 name
存储为 String
标量(基元)类型,并将 age
存储为 Int
标量(基元)类型。id
充当每个 Person
的特殊唯一标识符。它也是一个必需的值,由 !
符号表示。
接下来的两个对象类型的行为有所不同。GraphQL 为特殊对象类型保留一些关键字,这些关键字定义如何在架构中填充数据。Query
类型从源中检索数据。在我们的示例中,我们的查询可能从数据库中检索 Person
对象。这可能会让你想起RESTful术语中的GET
操作。Mutation
修改数据。在我们的示例中,我们的变更可能会在数据库中添加更多 Person
对象。这可能会让您想起 PUT
或 POST
等状态更改操作。本节稍后将介绍所有特殊对象类型的行为。
让我们假设示例中的 Query
从数据库中检索一些内容。如果我们查看 Query
的字段,就会看到一个名为 people
的字段。其字段值为 [Person]
。这意味着我们要检索数据库中的某个 Person
实例。不过,添加方括号意味着,我们希望返回所有 Person
实例的列表,而不仅仅是一个特定的实例。
Mutation
类型负责执行状态更改操作,例如数据修改。变更负责对数据来源执行一些状态更改操作。在我们的示例中,变更包含一个名为 addPerson
的操作,它将新的 Person
对象添加到数据库中。该变更使用 Person
并需要使用 id
、name
和 age
字段的输入。
此时,您可能想知道 addPerson
等操作在没有代码实施的情况下如何工作,因为它应该实施某种行为,并且看起来很像具有函数名称和参数的函数。目前,它不起作用,因为架构仅充当声明。要实施 addPerson
行为,我们必须为其添加一个解析器。解析器是一个代码单元,只要调用其关联字段(此处的 addPerson
操作),就会执行该代码单元。如果要使用某个操作,您必须在某个时候添加解析器实施。从某种意义上说,您可以将架构操作视为函数声明,并将解析器视为定义。将在另一个小节中介绍解析器。
该示例仅显示架构处理数据的最简单方法。您可以使用 GraphQL 和 Amazon AppSync功能构建复杂、稳健且可扩展的应用程序。在下一节中,我们将定义您可以在架构中使用的所有不同类型和字段行为。
正如您看到的一样,在 GraphQL 中具有很多不断变化的组件。在本节中,我们说明了一个简单架构的结构以及架构支持的各种类型和字段。在下一节中,您将了解 GraphQL 的其他组件API以及它们如何与架构配合使用。