GraphQL 学习指南 (21):GraphQL 查询语言 3.2

阅读数:3 2019 年 12 月 18 日 20:44

GraphQL学习指南(21):GraphQL查询语言 3.2

(GraphQL 查询字段)

内容简介
为什么 GraphQL 是 Ajax 诞生以来具创新性的数据获取技术?GraphQL 通过为 API 提供查询语言和用以完成查询的运行状态,提供了对 REST 和特定页面服务架构的替代方案。借助这《GraphQL 学习指南》,Alex Banks 和 Eve Porcello 为希望开始使用 GraphQL 的前端 Web 开发人员、后端工程师以及项目或产品经理提供了一条清晰的学习路径。你将先后探索图论、图数据结构和 GraphQL 类型,之后在实际项目中学习如何为照片共享应用构建 schema。
《GraphQL 学习指南》还将向你介绍 Apollo Client,可用来将 GraphQL 连接到你的用户界面。

假定有一个名为 Snowtooth 的滑雪胜地,这里的 Web 团队正在使用 GraphQL 提供关于缆车和雪道状态的实时信息。雪地摩托巡逻队可以通过手机直接开关缆车和雪道。本章的示例请参考 Snowtooth 的 GraphQL Playground 接口( http://snowtooth.moonhighway.com )。

你可以使用查询操作从 API 请求数据。查询字段就是你希望从 GraphQL 服务器获取的数据。在发送查询时,会按字段请求数据。你从服务器接收到的 JSON 数据响应中的相同字段会自动进行映射。例如,如果你发送 allLifts 查询字段请求名称和状态,那么便会收到一个 JSON 响应,其中包含 allLifts 的数组以及每个电梯 name(名称)和 status(状态)的对象字符串,如下所示:

复制代码
query {
allLifts {
name
status
}
}

错误处理
成功的查询将返回一个 JSON 文档,它会包含“data”键。如果查询失败,则会返回一个包含“errors”键的 JSON 文档,错误信息会作为值。JSON 中是可以同时包含“data”键和“errors”键的。

你可以向查询文档添加多个查询,但是一次只能运行一个操作。例如,你可以在查询文档中放置两个查询操作。

复制代码
query lifts {
allLifts {
name
status
}
}
query trails {
allTrails {
name
difficulty
}
}

当按下“play”按钮时,GraphQL Playground 将会要求你在两个操作之间选择一个。如果你想在一个请求中查询所有数据,那么就需要将全部字段放在同一个查询中:

复制代码
query liftsAndTrails {
liftCount(status: OPEN)
allLifts {
name
status
}
allTrails {
name
difficulty
}
}

这就是 GraphQL 开始展现优势的时候。可以在一次查询中接收各种不同的数据。我们通过 status: OPEN 查询状态为开启的缆车的数量 liftCount,它为我们提供了相应的数据。我们还可以查询每个电梯的 name 和 status。最后查询每条雪道的 name 和 difficulty。

Query 是 GraphQL 类型。我们称其为根类型(root type),因为它可以将操作进行映射,而操作代表了查询文档的根节点。我们已经在 API schema 中定义了可以查询的 GraphQL 字段。文档将告诉我们可以在查询类型上选择哪些字段。

根据文档,我们了解到当查询此 API 时,可以选择的字段有 liftCount、allLifts 和 allTrails。它也定义了更多字段可供选择,但是查询的关键就在于我们可以自主选择需要哪些字段以及省略哪些字段。

编写查询时,把需要的字段用大括号括起来。这些块被称为选择集(selection set)。在选择集内定义的字段和 GraphQL 类型直接相关。查询类型中已经定义了 liftCount、allLifts 和 allTrails。

选择集之间可以相互嵌套。因为 allLifts 字段返回了 Lift 类型的列表,所以我们需要使用大括号以在此类型上创建新的选择集。与缆车相关的各种数据都是可请求的,在此例中我们仅请求缆车的 name 和 status。同样,allTrails 查询字段也返回对应的 Trail 类型。

返回的 JSON 包括了我们在查询中请求的所有数据。数据的格式和我们的查询格式一致。每个 JSON 字段的名称也和我们选择集中的字段相同。可以通过指定别名来更改查询结果中返回对象的字段名称,如下所示:

复制代码
query liftsAndTrails {
open: liftCount(status: OPEN)
chairlifts: allLifts {
liftName: name
status
}
skiSlopes: allTrails {
name
difficulty
}
}

响应如下所示:

复制代码
{
"data": {
"open": 5,
"chairlifts": [
{
"liftName": "Astra Express",
"status": "open"
}
],
"skiSlopes": [
{
"name": "Ditch of Doom",
"difficulty": "intermediate"
}
]
}
}

现在我们把数据恢复到相同的结构,然后把其中几个字段重新命名。传入查询参数(query argument)可对 GraphQL 查询结果进行筛选。参数是与查询相关联的键值对。如果我们想要获知处于关闭状态的缆车的名字,可以发送一个参数来过滤响应:

复制代码
query closedLifts {
allLifts(status: "CLOSED", sortBy: "name") {
name
status
}
}

还可以使用参数来选择数据。举例来说,假设我们想要查询单个缆车的状态,那么可以传入唯一标识符:

复制代码
query jazzCatStatus {
Lift(id: "jazz-cat") {
name
status
night
elevationGain
}
}

这样我们就能够看到返回的“Jazz Cat”缆车数据,包括 name(名称)、status(状态)、night(夜间运行)和 elevationGain(爬高)。

GraphQL学习指南(21):GraphQL查询语言 3.2

购书地址 https://item.jd.com/12639300.html?dist=jd

评论

发布