概述
为了开始将我们 GraphQL 服务器 的各个部分拼凑起来,我们需要仔细研究 架构定义语言,即 SDL。它允许我们用 GraphQL 服务器 可理解的方式定义 对象类型 及其 字段。
在本课中,我们将
- 探索 SDL 语法
- 使用一个
Query
和一个Listing
类型定义一个基本架构 - 添加我们的依赖项
📄 探索 SDL
您可以将服务器的架构视为 契约,连接服务器和任何请求数据的客户端。它定义了 GraphQL API 可以和不可以做的事情,以及客户端如何请求或更改数据。它是一个抽象层,为使用者提供了灵活性,同时隐藏了后端实现细节。
在实践中,架构是 对象类型 的集合,其中包含 字段。每个 字段 都有自己的类型。字段的类型可以是 标量(例如 Int
或 String
),也可以是 另一个对象类型。我们很快就会看到一个例子。
GraphQL 类型语法
我们使用 type
关键字声明一个类型,后面跟着类型的名称(PascalCase 是最佳实践),然后用大括号括起它的 字段:
type Planet {}
字段 通过它们的名称(camelCase)、冒号,然后是字段的类型(标量 或对象)来声明。字段还可以包含列表,用方括号表示:
type Planet {id: IDname: Stringmass: IntnamesOfMoons: [String]}
GraphQL 中的可空性
此外,我们可以指示每个 字段 值是可空的还是不可空的。如果字段不应为 null,我们在其类型后面添加一个感叹号:
type Planet {id: ID!name: String!mass: IntnamesOfMoons: [String]}
此语法表明,Planet
返回 null
的 id
或 name
字段 是无效的;我们 要求 它们返回与指定数据类型匹配的值。相比之下,我们将允许 mass
和 namesOfMoons
在没有数据要返回的情况下为 null
。
使用多个对象类型
GraphQL 还使我们能够表示 对象之间 的关系。以这两个 对象类型 为例:
type Planet {id: ID!name: String!mass: Int}type Galaxy {id: ID!name: String!yearDiscovered: Int}
假设我们想要表示行星和星系之间的关系。例如,我们可能希望每个行星都指出它所属的星系。如何在 GraphQL 中表示这一点?
在这种情况下,我们可以用一个 字段 来更新 Planet
,该字段返回 另一个 对象类型;它指定了这颗行星所属的 哪个 星系。
type Planet {id: ID!name: String!mass: Intgalaxy: Galaxy}type Galaxy {id: ID!name: String!yearDiscovered: Int}
这种关系使我们能够 查询 行星的详细信息,然后进一步查询它所在的星系的详细信息。我们可以对数据提出更复杂的问题,例如 “这颗行星的质量是多少,它所属的星系叫什么名字?”—并将所有答案整齐地捆绑在同一个响应中。
记录架构
好的,在开始编写我们的架构之前,还有最后一件事: 描述。
就像对代码进行注释一样,对架构进行 记录 也是一个好习惯。这使您的团队成员(以及未来的您)更容易理解发生了什么。它还允许 GraphOS Studio Explorer 等工具在 API 用户需要时引导他们了解使用您的 API 可以实现什么。
为了做到这一点,SDL 允许您通过在类型和 字段 上方直接写入字符串(用引号括起来)来添加描述。
"I'm a regular description"
三重“双引号”允许您添加换行符,以便更清晰地格式化较长的注释。
"""I'm a block descriptionwith a line break"""
以下是完全记录的 GraphQL 类型可能的样子。
"Astronomical information for a single planet."type Planet {"The ID for the planet"id: ID!"The planet's name"name: String!"The total estimated mass of the planet (in kg)"mass: Int"The galaxy the planet is located in"galaxy: Galaxy}
涵盖了最后一点,让我们构建我们的架构!
练习
Query
类型的描述始终正确?关键要点
- 字段 是
Query
类型的入口点。它们是 GraphQL 消费者可以查询的顶级 字段 。 - GraphQL 对象类型 定义了我们可以在其中查询数据的 字段 。这些字段可以返回 标量 数据(例如
String
或Int
)或返回其他 对象类型 。
下一步
最后一点已经介绍完毕,让我们进入下一节课并构建我们的模式!
分享您关于本节课的问题和评论
本课程目前处于
您需要一个 GitHub 帐户才能在下面发帖。没有帐户? 请在我们的 Odyssey 论坛中发帖。