头图

你可能听说过 GraphQL,但对它与 REST 的区别还不完全确定。今天我们将介绍 REST 和 GraphQL 的一些基本原理,以及它们的不同使用场景。

GraphQL 作为 REST API 的替代品越来越受欢迎,不过它不一定是完全的“替代品”。

根据你的使用情景,你需要在 GraphQL、REST API,或者两者结合之间进行选择。让我们比较一下 REST 和 GraphQL,并了解一些 GraphQL 的优点,以便得出更明智的结论。

REST APIs

rest api

REST(表述性状态转移)API 是一种适用于应用程序接口(API)的架构风格,它使用 HTTP 请求来访问和使用数据。该数据可用于 GET、PUT、POST 和 DELETE 操作,这些操作分别对应于资源的读取、更新、创建和删除。

RESTful API 使用 HTTP 方法来执行 CRUD(创建、读取、更新和删除)过程。 为了方便缓存、AB 测试、认证等过程,HTTP 头部向客户端和服务器提供信息。

HTTP 主体包含客户端希望传输到服务器的数据,例如请求的有效负载。

GraphQL APIs

graphql apis

GraphQL 是一种用于 API 的查询语言,并且是一种用现有数据来满足这些查询的运行时。GraphQL 提供了一个完整且易于理解的 API 数据描述,允许客户端准确获取所需的数据,方便 API 的演进,并支持强大的开发者工具。Twitter、Expedia、Shopify 等知名公司已广泛采用 GraphQL,GraphQL 主要由 GraphQL 基金会维护和开发。

GraphQL 与 REST 的对比

diff

GraphQL 和 REST API 之间的主要区别在于,GraphQL 是一种查询语言,而 REST 是一种用于网络软件的架构概念。

GraphQL 和 REST 在数据传递方式上也有很大不同。在 REST 架构中,客户端提交 HTTP 请求,数据以 HTTP 响应的形式返回。在 GraphQL 架构中,客户端提交查询以获取数据。

常见场景

REST APIs

假设你有一个用于获取学生数据的 API。在典型的 REST 场景中,请求/响应可能如下所示:

// HTTP请求
GET api/students/1 || api/students?id=1

// HTTP响应
{
   "id": 1,
   "name": "john doe",
   "class": 3,
   "age": 11
}

在上面的例子中,发送到服务器的请求返回的是关于 ID 为 1 的学生的所有数据的对象。 由于 REST 的过度提取特性,这可能会花费较长时间,具体取决于数据的大小。

GraphQL

在 GraphQL 中,数据是通过严格列出所需字段来获取的。这样限制了一次获取所有数据。请参考下面的 GIF,了解使用 GraphQL 获取用户数据的方式。

gif1

在选择 GraphQL 和 REST 时需要考虑的因素

安全性

REST API 使用 HTTP,允许通过传输层安全协议(TLS)进行加密,并提供多种API认证选项。TLS 确保在两个系统之间传输的数据是私密且未被篡改的。支持 JavaScript 对象表示法(JSON)的网络令牌完成 HTTP 认证过程,以便从 Web 浏览器安全地传输数据。

GraphQL 的安全控制不如 REST API 那样成熟。为了利用 GraphQL 中的现有功能(如数据验证),开发者需要设计新的认证和授权技术。

易用性

REST API 使用 URI 和 HTTP 方法,当访问新的端点时,API 很难预测会发生什么。REST 没有指定的版本控制要求,因此各个提供者可以自行决定方法。

使用 GraphQL,你可以发送请求到 API 并接收到精确的响应,无需额外的添加。因此,GraphQL 查询提供了非常可预测的响应,具有良好的易用性。GraphQL 采用简单的方法,不需要对 API 进行版本控制。

性能

开发者可以通过 GraphQL 一次 API 请求来获取数据。为了避免数据的不足获取或过度获取,灵活的样式定义了信息请求的结构,并从服务器返回相同的结构。

与 GraphQL 相比,REST API 具有固态数据结构,可能首先返回不相关的信息(过度获取)。由于请求需要时间来到达适当的数据并传递相关信息,开发者必须进行多次调用。

缓存

所有 REST API 的 GET 端点都可以在服务器或通过 CDN 缓存。它们也可以被客户端存储以便常规使用,并且被浏览器缓存。GraphQL 通常通过一个单一的端点(通常是/graphql)提供,与 HTTP 规范有差异。这导致查询不能像 REST API 一样被缓存。

然而,由于可用工具,客户端的缓存比 REST 更优。一些使用缓存层的客户端(如 Apollo Client,URQL)利用 GraphQL 的模式和类型系统,在客户端保留缓存。

错误处理

每个 GraphQL 请求,无论成功还是错误,都会返回状态码 200。这与 REST API 不同,后者的每个状态码都指向特定类型的响应。

状态码RESTGraphQL
200OkOk
400Bad Request-
401Unauthorized-

REST API 的错误可以是 200 以外的任何代码,处理错误的客户端应了解所有可能的代码。

GraphQL 中任何合法的答复都应为 200,包括数据和错误响应。客户端工具将有助于更有效地管理错误。错误作为响应主体的一部分,在特定的 errors 对象下处理。

结论

让我们回顾一下上述讨论的内容。

RESTGraphQL
被广泛视为设计 API 的传统标准的架构风格一种用于解决集成 API 时常见问题的查询语言
简化与多个端点的工作需要昂贵的自定义中间件允许模式拼接和远程数据获取
不提供类型安全性或自动生成的文档提供类型安全性和自动生成的文档
响应输出通常是 XML、JSON 和 YAML响应输出为 JSON
支持多个 API 版本不需要 API 版本控制
自动使用缓存缺乏内置缓存机制
通过一组 URL 部署,每个 URL 暴露单一资源通过单一端点部署,通过该端点提供暴露服务的全部功能
使用服务器驱动的架构使用客户端驱动的架构

通过以上精心整理的差异,希望你能根据使用场景选择合适的技术。


Apifox
23 声望4 粉丝

Apifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化平台。Apifox = Postman + Swagger + Mock + JMeter