GraphQL 教程入门:什么是、特性和示例

什么是 GraphQL?

GraphQL 是一项应用层服务器端技术,由 Facebook 开发,用于执行现有数据的查询。GraphQL 可以优化 RESTful API 调用。它提供了一种声明式的方式来获取和更新数据。GraphQL 帮助您将数据从服务器加载到客户端。它使程序员可以选择他们喜欢的请求类型。

为什么使用 GraphQL?

使用 GraphQL 的原因如下:

  • 它提供了人类可读的查询。
  • 在 GraphQL 中,处理多个数据库非常容易。
  • 它适用于微服务和复杂系统。
  • 您可以通过一次 API 调用获取数据。
  • 它有助于您进行查询批处理和缓存。
  • 您不会遇到过度获取或获取不足的问题。
  • 根据您的需求定制请求。
  • 它有助于您以适当的格式发现模式。
  • GraphQL 会自动使文档与 API 更改保持同步。
  • API 演进无需版本控制即可实现。
  • GraphQL 字段用于多个查询,这些查询可以共享到更高的组件级别以供重用。
  • 您可以选择公开哪些函数以及它们如何工作。
  • 它可用于快速应用程序原型设计。

GraphQL 的应用

以下是 GraphQL 的重要应用:

  • 它提供了 Relay 和其他客户端框架。
  • GraphQL 可帮助您提高移动应用的性能。
  • 它可以减少过度获取问题,从而降低服务器端云服务成本并减少客户端网络使用量。
  • 当客户端应用程序需要指定长查询格式中所需的字段时,可以使用它。
  • 当您需要为旧的或现有的 API 添加功能时,可以充分利用 GraphQL。
  • 当您需要简化复杂的 API 时使用它。
  • 混合搭配外观模式,这在面向对象编程中很常见。
  • 当您需要将来自多个地方的数据聚合到一个方便的 API 中时。
  • 您可以将 GraphQL 用作现有 API 的抽象,以根据用户需求指定响应结构。

在学习 GraphQl 之前需要学习什么?

本 GraphQL 教程基于 ExpressNodeJs。因此,您可以通过对 NodeJS 的基本了解轻松学习 GraphQL。

GraphQL 关键组件

现在,在本 GraphQL 教程中,让我们学习 GraphQL 的关键组件。

GraphQL Key Components
GraphQL 关键组件

如上图所示,GraphQL 有三个关键组件:1) 查询(Query)、2) 解析器(Resolver)和 3) 模式(Schema)。

查询

查询是客户端应用程序发起的 API 请求。它支持增强和指向数组。查询用于读取或获取值。

查询的组成部分

以下是查询的重要组成部分:

  1. 字段

字段 simply indicates that we are asking the server for particular information. Following is a GraphQL example of a field in graphQL query. 字段简单地表示我们正在向服务器请求特定信息。以下是 GraphQL 查询中字段的 GraphQL 示例。

query {
    team {
        id name
    }
}

"data": {
    "team":[ {
        "id": 1, 
        "name": "Avengers"
    }
    ,
    …
]
}
}

在上面的 GraphQL 示例中,我们向服务器请求 team 字段及其子字段(如 id 和 name)。GraphQL 服务器以我们要求的格式返回数据。

  1. 参数

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)。

这个 JavaScript 库由 Facebook 开发,用于使用 GraphQL 创建 React 应用程序。GraphQL 客户端可以是 CMS(如 Drupal)、单页应用程序、移动应用程序等。

GraphQL 服务器

GraphQL 服务器是 GraphQL 规范的服务器端实现。它将您的数据表示为 GraphQL API,您的客户端程序可以查询这些数据来访问 数据库

GraphQL 网关

网关是一种微服务模式,您可以在其中构建一个单独的服务来处理其他后端服务。它提供可操作的文档,并提供一种便捷的方式,通过单个请求从多个来源收集数据。

GraphQL 中的变量是什么?

GraphQL 中的变量 用于将动态值与客户端查询分开,并将查询作为唯一的字典传递。GraphQL 中的变量也可用于重用客户端编写的具有单个参数的查询或变更。在 GraphQL 中,您不能在查询字符串中直接传递动态参数。原因是客户端代码需要在程序运行时动态地操纵查询字符串。

GraphQL 有一种将动态值从查询中分解出来的好方法。它将它们作为单独的字典传递。这些值称为变量。每当我们处理变量时,都需要执行以下三项操作:

  1. 将查询中的静态值替换为变量名。
  2. 将变量名声明为 GraphQL 查询接受的变量之一。
  3. 将值传递到特定于传输的变量字典中。

下面是所有内容的样子:

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 示例所示,我们只需传递一个不同的变量,而无需构建新查询。

什么是 Mutation(变更)?

Mutation(变更)是 GraphQL 中更改数据集的方式。它修改数据存储中的数据并返回值。Mutation 有助于插入、更新或删除数据。通常,Mutation 被定义为模式的一部分。

设计 GraphQL Mutation 时要考虑的点

以下是设计 GraphQL 时要考虑的重要点:

  • 命名:首先,您需要为变更加上动词。然后是名词,如果适用,则是“对象”。命名变更时请使用 camelCase。
  • 具体性:您需要尽可能使变更具体化。变更应代表用户执行的操作。
  • 输入对象:使用一个、唯一的、必需的输入对象类型作为参数来执行客户端上的变更。
  • 唯一负载类型:您应该为每个变更使用唯一的负载类型。您也可以将变更输出添加为该特定负载类型的字段。
  • 嵌套:在合适的地方对您的变更使用嵌套。它允许您充分利用 GraphQL API。

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:Gatsby 是一个由 GraphQL 驱动的应用程序,可以使用来自多个 GraphQL API 源的数据。您可以使用它来开发静态和客户端 React 应用程序。
  • GraphiQL这是一个与浏览器集成的 IDE,还可以与 GraphQL API 进行交互。GraphiQL 包含的一些功能包括变更、数据查询和自动完成查询。
  • GraphQL Playground这是一个功能强大的 IDE,内置编辑器用于处理变更、验证、GraphQL 查询、订阅等。开发人员可以使用此 IDE 来可视化模式的结构。
  • PrismaPrisma 是一个数据库抽象层,可将您的数据库转换为具有 CRUD(创建、读取、更新和删除)操作的 GraphQL API。
  • Bit这是一个开源工具和平台,可将可重用代码转换为组件。开发人员可以使用它们来共享和开发各种项目。

摘要

  • GraphQL 是一项应用层服务器端技术,由 Facebook 开发,用于执行现有数据的查询。
  • 您可以使用 GraphQL 通过一次 API 调用获取数据。
  • GraphQL 可帮助您提高移动应用的性能。
  • 重要的 GraphQL 查询组件是:1) 查询、2) 解析器、3) 模式。
  • GraphQL 是强类型的。这意味着查询是在特定系统上下文中执行的。
  • GraphQL 客户端是向相关 GraphQL 服务器发出 POST 请求的代码。
  • GraphQL 服务器是 GraphQL 规范的服务器端实现。
  • 网关是一种微服务模式,您可以在其中构建一个单独的服务来处理其他后端服务。
  • GraphQL 有一种将动态值从查询中分解出来的好方法。
  • Mutation(变更)是 GraphQL 中更改数据集的方式。
  • 设计 GraphQL 的要点是:1) 命名、2) 具体性、3) 输入对象、唯一负载类型和 4) 嵌套。
  • GraphQL 可以按模式进行组织,而 REST 可以按端点进行组织。
  • GraphQL 的缺点是它在后端部分缺乏资源。