为什么使用 GraphQL 而不是 REST? - Amazon AppSync
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

为什么使用 GraphQL 而不是 REST?

REST 是 Web API 的基石架构风格之一。不过,随着世界的互联程度变得越来越高,开发稳健且可扩展的应用程序的需求成为更紧迫的问题。虽然 REST 目前是构建 Web API 的行业标准,但已发现 RESTful 实施存在几个反复出现的缺点:

  1. 数据请求:在使用 RESTful API 时,您通常通过终端节点请求所需的数据。在您的数据可能没有那么整齐打包时,就会出现问题。您需要的数据可能位于多个抽象层后面,获取数据的唯一方法是使用多个终端节点,这意味着发出多个请求以获取所有数据。

  2. 过度获取和获取不足:除了多个请求的问题以外,来自每个终端节点的数据都是严格定义的,这意味着您返回为该 API 定义的任何数据,即使您在技术上并不需要这些数据。

    这可能会导致过度获取,这意味着我们的请求返回多余的数据。例如,假设您请求公司个人数据,并希望知道某个部门的员工姓名。返回数据的终端节点将包含姓名,但也可能包含其他数据,例如职位或出生日期。由于 API 是固定的,因此,您无法只请求姓名本身;其余数据也会随之而来。

    相反的情况是,我们没有返回足够的数据,这称为获取不足。要获取请求的所有数据,您可能需要向服务发出多个请求。根据设置数据结构的方式,您可能会遇到效率低下的查询,从而导致类似于令人头痛的 n+1 问题的情况。

  3. 开发迭代速度缓慢:很多开发人员定制其 RESTful API 以适应他们的应用程序流程。不过,随着应用程序的扩展,前端和后端可能需要进行大量更改。因此,API 可能不再以高效或有影响力的方式适应数据的形状。由于需要修改 API,这会导致产品迭代速度变慢。

  4. 大规模性能:由于这些复杂的问题,很多领域的可扩展性都会受到影响。应用程序端的性能可能会受到影响,因为您的请求返回太多的数据或太少的数据(导致更多请求)。这两种情况都会对网络造成不必要的压力,从而导致性能下降。在开发人员方面,开发速度可能会下降,因为您的 API 是固定的,不再适合他们请求的数据。

GraphQL 的卖点是克服 REST 的缺点。以下是 GraphQL 为开发人员提供的一些关键解决方案:

  1. 单个终端节点:GraphQL 使用单个终端节点查询数据。无需构建多个 API 以适应数据的形状。这会导致通过网络传输的请求减少。

  2. 获取:GraphQL 直接定义所需的数据以解决长期存在的过度获取和获取不足问题。GraphQL 允许您设置数据形状以满足您的需求,从而仅收到所要求的内容。

  3. 抽象:GraphQL API 包含一些使用与语言无关的标准描述数据的组件和系统。换句话说,数据形状和结构是标准化的,因此,前端和后端知道如何通过网络发送数据。这使两端的开发人员可以使用 GraphQL 的系统,而不是围绕它们工作。

  4. 快速迭代:由于数据标准化,在开发的一端进行更改时,可能不需要在另一端进行更改。例如,前端表示形式更改可能不会导致在后端进行大量更改,因为 GraphQL 可以轻松修改数据规范。您可以直接定义或修改数据的形状,以满足应用程序扩展时的需求。这会导致潜在的开发工作减少。

这些只是 GraphQL 的一部分好处。在接下来的几节中,您将了解如何设置 GraphQL 结构以及使其成为 REST 的独特替代方案的属性。