GraphQL 和 REST 之间有何区别?
GraphQL 和 REST 是设计通过互联网交换数据的 API 的两种不同方法。REST 使客户端应用程序能够使用 HTTP 谓词与服务器交换数据,HTTP 谓词是互联网的标准通信协议。与之相对的 GraphQL 则是一种 API 查询语言,它定义了客户端应用程序应如何从远程服务器请求数据的规范。您可以在 API 调用中使用 GraphQL,而不必依赖服务器端应用程序来定义请求。GraphQL 和 REST 都是我们大多数现代应用程序所依赖的强大技术。
GraphQL 和 REST 有什么相似之处?
GraphQL 和 REST 都是热门的 API 架构样式,能够通过客户端-服务器模型在不同的服务或应用程序之间交换数据。
API 便于访问数据和数据操作,如下所示:
- 客户端向服务器上的一个或多个端点发送 API 请求
- 服务器作出响应,其中包含数据、数据状态或错误代码
REST 和 GraphQL 允许您通过 API 在单独的应用程序、服务或模块上创建、修改、更新和删除数据。 使用 REST 开发的 API 被称为 RESTful API 或 REST API。使用 GraphQL 开发的 API 则被简单地称为 GraphQL API。
前端和后端团队使用这些 API 架构来创建模块化和可访问的应用程序。使用 API 架构有助于保持系统的安全、模块化和可扩展性。它还使系统性能更高,更易于与其他系统集成。
接下来,我们将讨论 GraphQL 和 REST 之间的其他一些相似之处。
架构
REST 和 GraphQL 均实施几项常见的 API 架构原则。例如,以下是两者共有的一些原则:
- 两者都是无状态的,因此服务器不会在请求之间保存响应历史记录
- 两者都使用客户端-服务器模型,因此来自单个客户端的请求会导致来自单个服务器的回复
- 两者都基于 HTTP,因为 HTTP 是底层通信协议
基于资源的设计
REST 和 GraphQL 都围绕资源设计数据交换。资源是指客户端可以通过 API 访问和操作的任何数据或对象。每个资源都有自己的唯一标识符 (URI) 和一组客户端可以对其执行的操作(HTTP 方法)。
例如,假设有一个社交媒体 API,用户可以在其中创建和管理文章。在基于资源的 API 中,一篇文章将是一个资源。它有自己的唯一标识符,例如 /posts/1234。而且它有一组操作,例如 GET 用于通过 REST 检索文章,query 用于通过 GraphQL 检索文章。
数据交换
REST 和 GraphQL 支持的数据格式都相似。
JSON 是最热门的数据交换格式,所有语言、平台和系统都能理解。服务器将 JSON 数据返回给客户端。还有其他可用,但不太常用的数据格式,包括 XML 和 HTML。
同样,REST 和 GraphQL 都支持缓存。因此,客户端和服务器可以缓存经常访问的数据以提高通信速度。
语言和数据库中立性
GraphQL 和 REST API 均适用于任何数据库结构和任何编程语言,包括客户端和服务器端。这使它们能够与任何应用程序高度互操作。
GraphQL 试图克服哪些 REST 限制?
GraphQL 于 2012 年问世,旨在应对新兴社交媒体平台对速度的需求。开发人员发现,像 REST 这样的现有 API 架构过于冗长和结构化,无法高效地制作新闻源。
接下来,我们来讨论一下他们面临的一些挑战。
固定结构的数据交换
REST API 要求客户端请求遵循固定结构以接收资源。这种严格的结构易于使用,但它并不总是准确交换所需数据的最有效方法。
超额获取和获取不足
REST API 总是返回整个数据集。例如,通过 REST API 中的 person 对象,您将获得该人员的姓名、出生日期、地址和电话号码。即使您只需要一个电话号码,您也会得到所有这些数据。
同样,如果您想知道某人的电话号码和上次购买时间,则需要执行多次 REST API 请求。URL /person 将返回电话号码,URL /purchase 将返回购买历史记录。
社交媒体开发人员必须编写大量代码来处理 API 请求,这影响了性能和用户体验。
GraphQL 是作为一种基于查询的解决方案出现的。查询只需一次 API 请求和响应交换即可返回确切的数据。
主要区别:GraphQL 与REST
REST API 是应用程序通信的架构概念。与之相对的 GraphQL 则是一种规范、一种 API 查询语言和一组工具。GraphQL 使用 HTTP 在单个端点上运行。
此外,REST 开发更侧重于创建新的 API。同时,GraphQL 的重点一直是 API 的性能和灵活性。
下面列出了两者的更多区别。
客户端请求
以下是 REST 请求正常运行所使用的元素:
- HTTP 谓词,用于确定操作
- 一个 URL,用于标识要对其执行 HTTP 谓词操作的资源
- 如果要在现有服务器端资源中创建或修改对象,则需要提供要解析的参数和值
例如,您可以使用 GET 从资源获取只读数据,使用 POST 来添加新的资源条目,或者使用 PUT 来更新资源。
相比之下,GraphQL 请求使用以下元素:
- 查询,用于获取只读数据
- 突变,用于修改数据
- 订阅,用于接收基于事件或流式传输的数据更新
数据格式描述您希望服务器如何返回数据,包括与服务器端架构匹配的对象和字段。您也可以输入新数据。在内部,GraphQL 以 POST HTTP 请求的形式发送每个客户端请求。
数据返回至客户端
在 REST 架构下,数据以服务器指定的整个资源结构从服务器返回给客户端。以下示例显示了 REST 和 GraphQL 中的返回数据。
REST 中返回数据的示例
在 REST 中,GET /posts 会返回以下内容:
[
{
"id": 1,
"title": "First Post",
"content": "This is the content of the first post."
},
{
"id": 2,
"title": "Second Post",
"content": "This is the content of the second post."
},
{
"id": 3,
"title": "Third Post",
"content": "This is the content of the third post."
}
)
GraphQL 中返回数据的示例
使用 GraphQL 时,仅返回客户端给定的结构中指定的数据。
GET /graphql?query{post(id: 1) {id title content}} 仅返回第一篇文章:
{
"data": {
"posts": [
{
"id": "1",
"title": "First Post",
"content": "This is the content of the first post."
},
]}}
服务器端架构
GraphQL 使用服务器端架构来定义数据和数据服务,这与 REST API 不同。
以 GraphQL 架构定义语言编写的架构包含如下细节:
- 属于每个对象的对象类型和字段
- 为每个字段定义操作的服务器端解析器函数
该架构明确定义了类型以描述系统上所有可用的数据以及客户端如何访问或修改这些数据。
与之相对的是,REST API 不需要服务器端架构。但是您可以选择定义它以实现高效的 API 设计、文档和客户端开发。
版本控制
随着 API 的发展,其数据结构和操作可能会发生变化。对于不了解这些变化的客户来说,它可能会破坏他们的系统或引入未知错误。
REST API 通常通过在 URL 中包含版本控制来解决这个问题,比如 https://example.com/api/v1/person/12341。 但是,版本控制不是强制性的,可能会导致错误。
GraphQL 需要 API 向后兼容性。因此,已删除的字段会返回错误消息,或者带有已过时标签的字段会返回警告。
错误处理
GraphQL 是一种强类型的 API 架构,这意味着它需要详细描述架构中的数据、结构和数据操作。由于架构非常详细,因此系统可以自动识别请求错误并提供有用的错误消息。
REST API 则是弱类型架构,您必须在周围的代码中内置错误处理功能。例如,如果 PUT 请求将数字值解析为文本而不是整数,系统不会自动识别该错误。
何时使用 GraphQL 与REST
您可以交替使用 GraphQL 和 REST API。但是,在某些用例中,一种或另一种架构更合适。
例如,如果您有以下考虑,GraphQL 可能是更好的选择:
- 您的带宽有限,并且希望最大限度地减少请求和响应的数量
- 您有多个数据来源,并且希望将它们合并到一个端点
- 您的客户端请求差异很大,并且您期望获得的响应也大不相同
相对而言,如果您有以下考虑,REST 可能是更好的选择:
- 您的应用程序较小,数据不太复杂
- 所有客户都以类似方式使用您的数据和操作
- 您不需要进行复杂的数据查询
也可以针对不同功能领域,同时使用 GraphQL API 和 REST API 来构建单一应用程序。
如何在同一 API 上同时使用 GraphQL 和 REST
无需执行完全重写即可将 RESTful API 升级到 GraphQL API。
以下是对该过程的概述:
- 了解 RESTful API 的数据模型。为此,请检查每个 URL 资源中数据的形状。
- 通过数据模型编写 GraphQL 架构。
- 确定客户端对数据执行哪些操作并将其包含在架构中。
- 在服务器端代码中为架构中的每个字段构建解析器函数。
- 使用解析器和架构创建 GraphQL 服务器。
之后,客户端可以使用 GraphQL 或 REST 与您的 API 进行通信。
差异摘要:REST 与GraphQL
REST |
GraphQL |
|
它是什么? |
REST 是一组规则,用于定义客户端和服务器之间的结构化数据交换。 |
GraphQL 是一种查询语言、架构样式以及一组用于创建和操作 API 的工具。 |
最适合 |
REST 适用于资源定义明确的简单数据来源。 |
GraphQL 适用于大型、复杂和相互关联的数据来源。 |
数据访问 |
REST 有多个 URL 形式的端点,用于定义资源。 |
GraphQL 只有一个 URL 端点。 |
返回的数据 |
REST 以服务器定义的固定结构返回数据。 |
GraphQL 以客户端定义的灵活结构返回数据。 |
如何构造和定义数据 |
REST 数据是弱类型。因此,客户端必须决定在返回格式化数据时如何解释数据。 |
GraphQL 数据是强类型。因此,客户端以预先确定且相互理解的格式接收数据。 |
检查时出错 |
使用 REST,客户端必须检查返回的数据是否有效。 |
使用 GraphQL,无效的请求通常会被架构结构拒绝。这会导致自动生成的错误消息。 |
AWS 如何支持您的 GraphQL 和 REST 要求?
Amazon Web Services (AWS) 可帮助您构建和提供更好的托管式 API。
AWS AppSync 可创建无服务器 GraphQL 和发布-订阅 (pub/sub) API。它们通过单个端点简化应用程序开发,从而安全地查询、更新或发布数据。
使用 AWS AppSync,可以创建允许客户端执行以下操作的 API:
- 借助单次网络调用与多个数据来源(如 SQL、NoSQL、搜索数据、REST 端点和微型服务)交互
- 在移动和 Web 应用程序与云之间自动同步数据
- 将数据从后端广播到连接的客户端以及在连接的客户端之间广播数据
- 访问物联网 (IoT) 数据,在移动或 Web 应用程序中构建实时仪表板
同样地,Amazon API Gateway 也是一种完全托管的服务,可以帮助您轻松创建、发布、维护、监控和保护任意规模的 API。
以下是您可以通过使用 API Gateway 获益的方式:
- 为用户提供适用于 API 请求和响应的高速性能
- 授权访问您的 API
- 同时运行同一 API 的多个版本,从而快速迭代、测试和发布新版本。
- 监控性能指标和有关 API 调用、数据延迟和错误率的信息。
立即创建账户,开始在 AWS 上使用 GraphQL 和 REST。