2. GraphQL 基础
3m

概述

让我们深入了解 的工作原理,以及使 运行的组件!

在本课中,我们将

  • 探索客户端请求数据的过程以及 如何检索数据
  • 了解组成 的组件

GraphQL 操作之旅

让我们想象一下,我们的前端需要为特定页面获取数据。

为了获取该数据,它会向我们的 发送一个 。应用程序将操作塑造成一个字符串,该字符串定义了它所需的 。然后,它将该操作通过 HTTP POSTGET 请求发送到服务器。

Hand-drawn illustration depicting client-land with a browser sending a query to server-land across a network

在服务器端

当我们的服务器接收到 HTTP 请求时,它首先会提取包含 的字符串。它会解析并将其转换为更易于操作的形式:一个树状结构的 ,称为 AST(抽象语法树)。使用此 AST,服务器会根据我们 Schema 中的类型和 验证

如果存在任何问题(例如,请求的 未在 Schema 中定义,或者 格式错误),服务器将抛出错误并将其立即发送回应用程序。

Hand-drawn illustration depicting server-land with the GraphQL server receiving a query and going through the necessary steps

在这种情况下, 似乎没有问题,服务器可以“执行”它。这意味着,服务器可以继续其进程并实际获取数据。服务器会沿着 AST 向下遍历。

对于 中的每个 ,服务器都会调用该字段的 解析器函数。该函数的使命是通过从正确来源(例如数据库或 REST API)填充正确数据来“解析”其 。这些 不一定需要驻留在 中;它们可以托管在外部。

这样, 成为了 REST(和其他 !)的强大桥梁,它将应用程序的所有数据连接在一起。GraphQL API 充当它们的顶层,提供一个单一接口,可以通过该接口同时查询多个数据源。

Hand-drawn illustration depicting a resolver function retrieving data from data-land

当所有 都解析完毕后,数据将被组装成一个格式良好的 JSON 对象,该对象与 的形状完全相同。

服务器将该对象分配给 HTTP 响应主体中的 data 键,现在是返回应用程序的时候了。

Hand-drawn illustration depicting the server returning a response back to the browser in client-land

回到客户端

我们的客户端会收到包含其所需数据的响应,将该数据传递给正确的组件以进行渲染,然后,我们的数据会在 UI 中栩栩如生。

现在我们已经对从客户端到服务器再返回来的整个过程有了鸟瞰图,我们将花一些时间深入了解 ,该文档概述了我们服务器的所有数据功能:

GraphQL Schema

是所有魔法发生的地方,但 Schema 告诉我们菜单上有哪些东西。

Schema 是一个类型和 的集合,它们构成我们可以使用 中的数据执行的所有操作的综合图像。这里没有实际数据;只有实时数据将符合的形状的基本骨架。(想象一下蓝图!)

Schema 拥有自己的语言,称为 Schema 定义语言,或 SDL。我们将在下一课中详细了解 语法,以及如何在我们的 Schema 中构建类型和

Schema 入口点

一个 (客户端发送到 的东西)可以是 查询变异订阅。一个 读取 数据,一个 更改 数据,一个 会监听实时流式数据。

所有三种 都映射到 Schema 中的对应类型:QueryMutationSubscription

Query 就像我们通往 的前门。它定义了许多 ,每个字段代表一个我们可以“跟踪”的路径,以便从我们的 GraphQL 服务器获取一些数据。每个字段都有自己的名称,并指定它返回的数据类型。这使得我们可以轻松地选择不同的字段,并一次获取我们想要的所有数据!

我们可以将 看作 Query 类型中我们可以从我们的 API 中 请求的东西 的列表。类似地,Mutation 类型是我们可以对我们的 API 执行的 操作 的列表,我们将在后面的课程中看到。

模式优先设计

要构建我们的 ,我们将使用“模式优先”设计。这意味着我们将根据下游消费者(例如在移动设备和桌面设备上运行的客户端应用程序)需要的确切数据来实现项目。模式优先设计通常涉及三个主要步骤:

  1. 定义模式:我们确定我们的功能需要哪些数据,然后我们构建我们的模式,以尽可能直观地提供这些数据。
  2. 后端实现:我们使用 TypeScript 构建我们的 API,并从包含它的任何 中获取所需数据。我们将从硬编码的模拟数据开始学习概念,然后将我们的服务器连接到实时 REST 数据源。
  3. 使用数据:客户端能够从我们的 API 中使用数据。

模式优先设计的优点之一是它通过允许前端和后端团队并行工作来减少总开发时间。前端团队可以在模式定义后立即开始使用模拟数据,而后端团队则根据同一模式开发 API。这不是设计 API 的唯一方法,但我们认为它是一种有效的方法,因此我们将在本课程中使用它。

使用解析器解析模式字段

正如我们在 的旅程中提到的,对于 中的每个类型和 ,我们可以定义一个 函数。解析器获取特定字段的数据。这些函数可以访问各种 :数据库、REST API,甚至文本文件或 JSON!

A resolver reaching out to a variety of different sources for data

使我们能够定义获取 数据所需的精确逻辑,但我们并不一定需要为模式中的每个字段手动定义解析器。我们将在即将到来的课程中看到如何以及何时定义解析器函数。

💾 数据!

在本课程中,我们将构建 API,它为星际列表及其功能提供(并更新)数据。

此模型展示了一行精选列表。对于每个列表,我们可以开始查看我们需要哪些数据:照片、位置类型、总体评分、床位数量、标题、每晚费用以及是否关闭预订。

A screenshot of Airlock, focused on the row of featured listings and their required fields

要为 特定 列表创建视图,我们需要为每个列表添加几个额外的 :其描述以及它提供的便利设施。

A screenshot of a single listing in Airlock, focused on two additional required fields

要使用 来表示这些不同的部分,我们可以将我们的数据视为 对象(例如列表和便利设施)和 关系(例如,每个列表至少有一个便利设施)。

现在,如果我们将每个对象视为一个 节点,并将每个关系视为两个节点之间的 ,我们就可以将我们的整个数据模型想象成节点和边的集合。这被称为我们应用程序的

要定义我们 中的对象,我们将使用一种称为 的特殊语法。让我们在下一课中进一步讨论

练习

以下哪些是我们的 GraphQL 服务器在收到请求时执行的操作?
以下哪些情况下我们的 GraphQL 服务器会抛出错误?
当查询成功执行时,以下哪些内容包含在 GraphQL 服务器返回的对象中?
GraphQL 操作
有三种类型的 GraphQL 操作。一个 
 
 读取数据。一个 mutation 
 
 数据。一个 
 
 侦听实时流式数据。

将项目从此框拖放到上面的空白处

  • 连接

  • 更改

  • 问题

  • 订阅

  • 屏幕截图

  • 查询

以下哪些准确描述了 GraphQL 中的图?

关键要点

  • 有三种类型的 :查询、。一个 读取 数据,一个 更改 数据,一个 侦听实时流式数据。
  • 模式 是类型和 的集合,它们构成了我们可以使用 中数据执行的所有操作的全面图景。它使用 () 编写。
  • 一个 函数检索特定 在我们的模式中的数据。这些函数可以访问各种 :数据库、REST API,甚至文本文件或 JSON。这些数据源不需要位于 中。

接下来

本课程主要介绍如何构建一个 ,让我们开始吧!准备好了,现在就来学习

上一页

分享您对本课的疑问和评论

本课程目前处于

测试版
.您的反馈有助于我们改进!如果您遇到问题或感到困惑,请告诉我们,我们会帮助您解决。所有评论都是公开的,必须遵守 Apollo 行为准则。请注意,已解决或已处理的评论可能会被删除。

您需要一个 GitHub 帐户才能在下方发帖。没有帐户? 请改为在 Odyssey 论坛发帖。