GraphQL 初学者教程:什么是 GraphQL、功能和示例
什么是 GraphQL?
GraphQL GraphQL 是一种应用层服务器端技术,由 Facebook(现为 Meta)开发,用于执行基于现有数据的查询。它于 2015 年公开发布,并由 GraphQL 规范进行管理。 Foundation 自 2018 年以来,GraphQL 可以优化 RESTful API 调用。它提供了一种声明式的方法来获取和更新数据。GraphQL 帮助您将数据从服务器加载到客户端,并允许程序员选择他们想要发出的请求类型。
学习 GraphQL 之前需要学习什么?
本 GraphQL 教程基于 快捷配送 和 节点。因此,只要对 NodeJS 有基本的了解,你就可以非常轻松地学习 GraphQL。
为什么使用 GraphQL?
以下是使用 GraphQL 的原因:
- 它提供了人类可读的查询。
- 在 GraphQL 中,处理多个数据库非常容易。
- 它适用于微服务和复杂系统。
- 您可以通过单个 API 调用来获取数据。
- 它可以帮助您进行查询批处理和缓存。
- 您不会遇到过度获取和获取不足的问题。
- 根据您的需要定制请求。
- 它可以帮助您发现适当格式的模式。
- GraphQL 会自动保持文档与 API 更改同步。
- API 的演变无需版本控制。
- GraphQL 字段用于多个查询,可以共享到更高的组件级别以供重用。
- 您可以选择要公开的功能以及它们的工作方式。
- 它可用于快速应用原型设计ping.
GraphQL 的应用
以下是 GraphQL 的重要应用:
- 它提供 Relay 和其他客户端框架
- GraphQL 帮助您提高移动应用程序的性能。
- 它可以减少过度获取问题,从而降低服务器端云服务并降低客户端的网络使用率。
- 当客户端应用程序必须指定长查询格式中需要哪些字段时可以使用它。
- 当您必须向旧的或现有的 API 添加功能时,可以充分利用 GraphQL。
- 当您必须简化复杂的 API 时使用它。
- 混合并混搭外观模式,这在面向对象编程中很常用。
- 当您必须将来自多个地方的数据聚合到一个方便的 API 中时。
- 你可以使用 GraphQL 作为绝对值trac在现有 API 的基础上,根据用户需求指定响应结构。
这些好处都建立在三个相互协作的基础上。
GraphQL 关键组件
现在,在本 GraphQL 教程中,让我们学习 GraphQL 的关键组件:

如上图所示,GraphQL 有三个关键组件:1)Query,2)Resolver,3)Schema。
询问
查询是客户端计算机应用程序发出的 API 请求。它支持扩充和指向数组。查询用于读取或获取值。
查询部分:
以下是查询的重要部分
- 领域:
字段的作用在于表明我们正在向服务器请求特定信息。以下是 GraphQL 查询中字段的一个示例。
query {
team {
id
name
}
}
服务器返回一个 JSON 文档,其结构与查询语句一致:
{
"data": {
"team": [
{
"id": 1,
"name": "Avengers"
}
]
}
}
在上面的 GraphQL 示例中,我们向服务器请求名为 team 的字段及其子字段,例如 id 和 name。GraphQL 服务器返回了我们请求的数据。
- 参数
In REST的我们只能传递一组参数作为 URL 细分和查询参数。要获取特定用户画像,典型的 REST 调用如下所示:
GET /api/team?id=2 Content-Type: application/json { "id": 2, "name": "Justice League" }
解决
解析器提供了将 GraphQL 操作转换为数据的方向。它们通过定义解析器函数将查询解析为数据。
它向服务器显示根据特定字段获取数据的流程和位置。解析器还将数据库架构和 API 架构分开。分离的信息有助于修改从数据库获取的内容。
架构
GraphQL 模式是 GraphQL 实现的核心。它描述了连接到它的客户端可用的功能。
GraphQL 的功能
以下是 GraphQL 的重要特性:
- 它提供声明性查询语言,这不是命令式的。
- 它是分层的并且以产品为中心。
- GraphQL 是强类型的。这意味着查询是在特定系统的上下文中执行的。
- GraphQL 中的查询在客户端中编码,而不是在服务器中编码。
- 它具有OSI模型应用层的所有功能。
GraphQL 客户端
GraphQL 客户端是向相关 GraphQL 服务器发出 POST 请求的代码。您可以直接查询 GraphQL API,但更好的方法是利用 Relay 的专用客户端库。
本篇 Java脚本库由 Facebook 开发,用于使用 GraphQL 制作 React 应用程序。GraphQL 客户端可以是 Drupal 之类的 CMS、单页应用程序、移动应用程序等。
GraphQL 服务器
GraphQL 服务器是 GraphQL 规范的服务器端实现。它将您的数据描述为 GraphQL API,您的客户端程序可以通过该 API 查询数据。 数据库.
GraphQL 网关
Gateway 是一种微服务模式,它允许您构建一个独立的服务来处理其他后端服务。它提供完善的文档,并提供了一种便捷的方式,可以通过单个请求从多个数据源收集数据。
GraphQL 中的变量是什么?
A GraphQL 中的变量 用于将动态值与客户端查询分开,并将查询作为唯一字典传递。GraphQL 中的变量还可用于重用客户端使用单独参数编写的查询或突变。在 graphQL 中,您不能直接在查询字符串中传递动态参数。原因是客户端代码需要在运行程序时动态操作查询字符串。
GraphQL 提供了一种很好的方法,可以将动态值从查询中分离出来。它将这些值作为单独的字典传递。这些值被称为变量。每当我们处理变量时,都需要执行以下三项操作:
- 用变量名替换查询中的静态值。
- 将变量名声明为 GraphQL 查询接受的变量之一。
- 在传输特定的变量字典中传递值。
这就是它整体的样子。首先是查询语句,它声明了变量:
query HeroNameAndFriends($episode: Episode) { hero(episode: $episode) { name friends { name } } }
然后是随附的单独的变量值字典:
{
"episode": "JEDI"
}
服务器返回的响应是:
{
"data": {
"hero": {
"name": "R2-D2",
"friends": [
{ "name": "Luke Skywalker" },
{ "name": "Han Solo" },
{ "name": "Leia Organa" }
]
}
}
}
正如您在上面的 GraphQL 示例中看到的,除了需要构建新的查询之外,我们只是传递了一个不同的变量。
什么是突变?
突变是一种在 GraphQL 中更改数据集的方法。它修改数据存储中的数据并返回一个值。突变可帮助您插入、更新或删除数据。通常,突变被定义为架构部分。
设计 GraphQL 突变时需要考虑的要点
以下是设计 GraphQL 时的重要点:
- 命名: 首先,您必须为突变命名动词。然后是名词,或“对象”(如果适用)。命名突变时使用驼峰式命名法。
- 特异性: 您必须尽可能使变更具有针对性。变更应该代表用户采取的语义操作。
- 输入对象: 使用一个唯一的、必需的输入对象类型作为在客户端执行变异的参数。
- 唯一有效载荷类型: 您应该为每个突变使用唯一的有效负载类型。您还可以将突变输出作为字段添加到该特定有效负载类型。
- 嵌套: 在任何有意义的地方对突变使用嵌套。它允许您充分利用 GraphQL API。
查询用于读取数据,变更用于写入数据。第三种操作类型涵盖客户端仍保持连接时发生更改的数据。
GraphQL 中的订阅是什么?
A 订阅 订阅是 GraphQL 规范中的第三种操作类型,另外两种是查询和变更。查询和变更都通过一次请求和响应完成。而订阅则会保持一个长期连接(通常通过 WebSocket),以便服务器在每次特定事件发生时向客户端推送新的结果。
该语法与查询语句类似,其中 subscription 关键字替换了 query:
subscription OnCommentAdded($postId: ID!) { commentAdded(postId: $postId) { id content author { name } } }
订阅模式在实践中具有以下三个特点。
- 事件驱动,而非轮询: 客户端只需注册一次意向。在服务器发布匹配事件之前,不会发送任何其他信息,这比重复轮询的成本要低得多。
- 每个订阅对应一个根字段: 该规范只允许一个顶级字段,这与可以一次请求多个字段的查询不同。
- 最好保持小规模: 仅推送界面必须刷新的字段。典型的应用场景包括:实时聊天、通知和价格行情推送。
GraphQL 和 REST 之间的区别
下表显示了之间的重要区别 GraphQL 和 REST.
| GraphQL | REST的 |
|---|---|
| 它遵循客户端驱动的架构。 | 它遵循服务器驱动的架构。 |
| GraphQL 可以按照模式来组织。 | REST 可以根据端点来组织。 |
| GraphQL 是一个正在不断发展的社区。 | REST 是一个非常大的社区。 |
| GraphQL 中的开发速度很快。 | REST 中的开发速度较慢。 |
| GraphQL 的学习曲线非常陡峭。 | REST 的学习曲线适中。 |
| 身份和你获取身份的方式是分开的。 | 您在 REST 中调用的端点是特定对象的身份。 |
| 在 GraphQL 中,客户端决定接收哪些字段。 | 在 REST 中,资源的形状和大小由服务器决定。 |
| GraphQL 在所有平台上提供高度一致性。 | 在所有平台上保持一致性非常困难。 |
GraphQL 的缺点
以下是 GraphQL 的缺点:
- 年轻的生态系统
- 后端资源不足。
- 缺少复杂应用程序的设计模式。
- 复杂查询的性能问题。
- 对于小型应用程序来说有点过分了
- GraphQL 不依赖于能够存储请求内容的 HTTP 缓存方法。
- GraphQL 不理解文件。因此,它不包含文件上传功能。
- 使用 GraphQL,需要做好大量的开发前教育准备,例如学习模式定义语言。
GraphQL 使用的开源应用程序和工具
GraphQL 使用的重要开源应用程序和工具如下:
- 盖茨比Gatsby 是一个基于 GraphQL 的应用程序,它可以处理来自多个 GraphQL API 数据源的数据。您可以使用它来开发静态和客户端 React 应用程序。
- 图形语言: 它是一款集成了浏览器并能与GraphQL API交互的IDE。GraphiQL包含的一些功能包括变更、数据查询和自动完成查询。
- GraphQL 游乐场: 它是一款功能强大的集成开发环境 (IDE),内置编辑器,可用于处理变更、验证、GraphQL 查询、订阅等。开发者可以使用此 IDE 可视化模式结构。该项目现已停止维护,其功能已合并回 GraphiQL。
- PRISMA: Prisma是一个数据库abstraction 层现在以类型安全的 ORM 的形式提供,广泛与 GraphQL 服务器配合使用,以公开 CRUD(创建、读取、更新和删除)操作。
- 位: 它是一个将可重用代码转换为组件的开源工具和平台。开发人员可以使用它们来共享和开发各种项目。

