理解 GraphQL 查询语言
Facebook 开源 GraphQL 时,它包含几个不同的部分。它附带了一份规范文档,该文档描述了 GraphQL 查询语言和模式定义语言的所有特性。此外,它还附带了一个名为 `GraphQLServer` 的 GraphQL 服务器参考实现graphql.js。这是一个 GraphQL 服务器的示例,以便其他人可以使用各种语言实现自己的服务器。
规范为我们提供了规则,参考实现为我们指明了方向。但第三个要素——GraphiQL——赋予了我们访问权限,而访问权限正是赢得众多拥趸的关键。
GraphiQL是一个浏览器内集成开发环境 (IDE),可让您探索 GraphQL API。无需任何设置。GraphiQL 允许您试验查询语言(即 GraphQL 的 QL 部分),它是您在任何 GraphQL 实现中执行任何操作的核心。
查询语言已根据规范进行了标准化。无论使用何种语言,GraphQL 查询都是 GraphQL 查询。查询语法是一个字符串,无论项目使用的是 JavaScript、Java、Haskell 还是其他任何语言,其形式都相同。
为了演示查询语言的一些特性,我们将使用Snowtooth API,这是一个用于模拟滑雪度假村的真实 GraphQL API。该 API 使用 GraphQL Playground,一个类似于 GraphiQL 的工具,它允许您直接在浏览器中发送查询并接收数据。
当您访问中心的Snowtooth API时,您会看到 GraphQL 端点: https://snowtooth.moonhighway.com,我们将向此端点发送 GraphQL 查询。GraphQL 只有一个端点。
当我们想从 API 请求数据时,我们会使用查询。发送查询时,您是按字段请求数据单元。这些字段对应于您从服务器收到的 JSON 数据响应中的相同字段。例如,如果您发送一个查询allLifts并请求名称和状态字段,您应该会收到一个 JSON 响应,其中包含一个数组allLifts以及每个电梯的名称和状态字符串,如下所示:
query {
allLifts {
name
status
}
}
将此查询添加到屏幕左侧。点击“运行”按钮,您将在右侧看到 JSON 响应。请注意,发送查询后,查询中的所有字段都与响应中的字段匹配。
关键字query称为操作名称。它描述了要发送到 GraphQL 服务的查询或操作类型。花括号内嵌套的是字段。字段会返回一些数据。花括号内的所有字段统称为选择集。
您可以向查询文档中添加多个查询,但一次只能运行一个操作。例如,您可以在查询文档中放置两个查询操作:
query {
allLifts {
name
status
}
}
query {
allTrails {
name
difficulty
}
}
如果你尝试运行这些查询,就会看到错误。如果一个查询文档中包含多个查询,则必须为每个查询指定一个操作名称。你可以把操作名称想象成函数名称。
query lifts {
allLifts {
name
status
}
}
query trails {
allTrails {
name
difficulty
}
}
按下“播放”按钮后,会出现一个下拉菜单,提示您选择以下两种操作之一。如果您想一次性请求所有数据,可以将所有操作放在同一个查询中:
query liftsAndTrails {
allLifts {
name
status
}
allTrails {
name
difficulty
}
}
GraphQL 的优势在这里开始显现。我们能够在单个查询中获取各种不同的数据点。我们还可以查询每部电梯的名称和状态。最后,我们还可以在同一个查询中查询每条步道的名称和难度。
连接
在 GraphQL 查询中,字段可以返回标量类型或对象类型。标量类型类似于其他语言中的基本类型。它们是选择集的叶子节点,返回单个值。GraphQL 内置了五种标量类型:整数(int Int)、浮点数(float Float)、字符串(string String)、布尔值(boolean Boolean)和唯一标识符(unique identifier ID)。
整数和浮点数都返回 JSON 数字,字符串和 ID 返回 JSON 字符串。布尔值返回布尔值。尽管 ID 和字符串返回的是相同类型的 JSON 数据,GraphQL 仍然会确保 ID 返回的字符串是唯一的。
GraphQL 对象类型是由一个或多个字段组成的集合,这些字段在你的模式中定义。它们定义了应该返回的 JSON 对象的结构。JSON 和 GraphQL 都允许字段下无限嵌套对象。我们可以通过查询一个对象来获取相关对象的详细信息,从而将对象连接起来。
例如,假设我们想要返回有关每部电梯所到达的步道的数据:
query {
allLifts {
name
capacity
trailAccess {
name
}
}
}
在这个查询中,我们请求所有缆车的数据,以及每条缆车可到达的所有雪道。我们的选择集包含对 capacity 字段的请求。capacity 是一个标量类型,它返回一个整数,表示一条缆车可乘坐的人数。trailAccess 字段的类型为 Trail(对象类型)。在本例中,trailAccess 返回一个经过筛选的雪道列表,其中包含每条缆车可到达的雪道。
此示例操作查询两种数据类型(电梯和轨道)之间的一对多关系。一个电梯连接到多个相关的轨道。
步道与缆车之间也存在同样的关联。这种关联是通过字段建立的accessedByLifts。查询该字段时,系统会返回到达步道所需的缆车线路。
query AllTrails {
allTrails {
name
accessedByLifts {
name
}
}
}
想要深入了解 GraphQL 查询语言,请查看egghead.io 上Eve 的查询语言课程。
文章来源:https://dev.to/eveporcello/understanding-the-graphql-query-language-57em