

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

# 为什么使用 GraphQL 而不是 REST？
<a name="why-use-graphql"></a>

REST 是 Web 的基石架构风格之一 APIs。不过，随着世界的互联程度变得越来越高，开发稳健且可扩展的应用程序的需求成为更紧迫的问题。虽然 REST 通常用于构建 Web APIs，但已经发现了 RESTful 实现中反复出现的几个缺点：

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

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

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

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

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

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

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

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

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

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

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

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