概述
为了开始将我们 GraphQL 服务器 的各个部分拼凑在一起,我们需要仔细研究 架构定义语言,或 SDL。 这是让我们能够实际定义 对象类型 及其 字段 的语法,以便 GraphQL 服务器 能够理解。
在本课中,我们将
- 探索 SDL 语法
- 使用一个
Query
和一个Listing
类型来定义基本架构 - 添加我们的 DGS 依赖项
📄 探索 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 资源管理器 等工具在 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
类型的描述始终为真?关键要点
- The fields of the
Query
type are entry points into our schema. These are the top-level fields that a GraphQL consumer can query for. - GraphQL object types define fields we can query for data. These fields can return scalar data (such as
String
orInt
) or return other object types.
接下来
最后一点内容已经讲解完毕,让我们开始下一课,构建我们的模式!
分享你对本课的疑问和评论
本课程目前处于
你需要一个GitHub账户才能在下方发布。没有账户? 请改为在我们的Odyssey论坛中发布。