你可能听说过 GraphQL,但对它与 REST 的区别还不完全确定。今天我们将介绍 REST 和 GraphQL 的一些基本原理,以及它们的不同使用场景。
GraphQL 作为 REST API 的替代品越来越受欢迎,不过它不一定是完全的“替代品”。
根据你的使用情景,你需要在 GraphQL、REST API,或者两者结合之间进行选择。让我们比较一下 REST 和 GraphQL,并了解一些 GraphQL 的优点,以便得出更明智的结论。
REST APIs
REST(表述性状态转移)API 是一种适用于应用程序接口(API)的架构风格,它使用 HTTP 请求来访问和使用数据。该数据可用于 GET、PUT、POST 和 DELETE 操作,这些操作分别对应于资源的读取、更新、创建和删除。
RESTful API 使用 HTTP 方法来执行 CRUD(创建、读取、更新和删除)过程。 为了方便缓存、AB 测试、认证等过程,HTTP 头部向客户端和服务器提供信息。
HTTP 主体包含客户端希望传输到服务器的数据,例如请求的有效负载。
GraphQL APIs
GraphQL 是一种用于 API 的查询语言,并且是一种用现有数据来满足这些查询的运行时。GraphQL 提供了一个完整且易于理解的 API 数据描述,允许客户端准确获取所需的数据,方便 API 的演进,并支持强大的开发者工具。Twitter、Expedia、Shopify 等知名公司已广泛采用 GraphQL,GraphQL 主要由 GraphQL 基金会维护和开发。
GraphQL 与 REST 的对比
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 获取用户数据的方式。
在选择 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 不同,后者的每个状态码都指向特定类型的响应。
状态码 | REST | GraphQL |
---|---|---|
200 | Ok | Ok |
400 | Bad Request | - |
401 | Unauthorized | - |
REST API 的错误可以是 200 以外的任何代码,处理错误的客户端应了解所有可能的代码。
GraphQL 中任何合法的答复都应为 200,包括数据和错误响应。客户端工具将有助于更有效地管理错误。错误作为响应主体的一部分,在特定的 errors 对象下处理。
结论
让我们回顾一下上述讨论的内容。
REST | GraphQL |
---|---|
被广泛视为设计 API 的传统标准的架构风格 | 一种用于解决集成 API 时常见问题的查询语言 |
简化与多个端点的工作需要昂贵的自定义中间件 | 允许模式拼接和远程数据获取 |
不提供类型安全性或自动生成的文档 | 提供类型安全性和自动生成的文档 |
响应输出通常是 XML、JSON 和 YAML | 响应输出为 JSON |
支持多个 API 版本 | 不需要 API 版本控制 |
自动使用缓存 | 缺乏内置缓存机制 |
通过一组 URL 部署,每个 URL 暴露单一资源 | 通过单一端点部署,通过该端点提供暴露服务的全部功能 |
使用服务器驱动的架构 | 使用客户端驱动的架构 |
通过以上精心整理的差异,希望你能根据使用场景选择合适的技术。
- 源于:REST API vs GraphQL - DEV Community