REST(表述性状态传输)API 是一种应用程序接口 (API) 的架构风格,它使用 HTTP 请求来访问和使用数据。该数据可用于GET、PUT、POST和DELETE数据类型,指的是对资源的读取、更新、创建和删除操作。 RESTful API 使用 HTTP 方法在处理数据时执行 CRUD(创建、读取、更新和删除)过程。 为了促进缓存、AB 测试、身份验证和其他过程,标头向客户端和服务器提供信息。 主体包含客户端想要传输到服务器的数据,例如请求的有效负载。
GraphQL 是一种用于 API 的查询语言,也是使用现有数据完成这些查询的运行时。GraphQL 为您的 API 中的数据提供完整且易于理解的描述,使客户能够准确地询问他们需要什么,仅此而已,随着时间的推移更容易发展 API,并启用强大的开发人员工具。GraphQL 已被 Twitter、Expedia、Shopify 等知名组织广泛采用,主要由 GraphQL 基金会维护和开发。
GraphQL 和 REST API 之间的主要区别在于 GraphQL 是一种查询语言,而 REST 是一种基于网络的软件的架构概念。 同样,将数据提供给客户端的方式是 GraphQL 和 REST 分歧最大的地方。在 REST 设计中,客户端提交 HTTP 请求,数据作为 HTTP 响应返回。在 GraphQL 架构中,客户端提交查询以获取数据。
假设您有一个 API 来获取学生数据。在典型的 REST 场景中,请求/响应如下所示:
// HTTP REQUEST
GET api/students/1 || api/students?id=1
// HTTP RESPONSE
{
"id": 1
"name": "john doe",
"class": 3,
"age": 11
}
在上面的示例中,对发送到服务器的请求的响应将是关于 id 为 1 的学生的所有数据的对象。由于 过度获取的性质,这有时可能需要更长的时间,具体取决于数据的大小休息
在 GraphQL 中,如果通过严格列出所需字段的数量来获取数据。这限制了一次获取所有数据。考虑下面使用 graphQL 获取用户数据的 GIF。
动图
REST API 使用 HTTP,允许使用传输层安全性进行加密,并提供多种 API 身份验证选项。TLS 确保两个系统之间的数据传输是私密且未更改的。支持 JavaScript 对象表示法 (JSON) 的 Web 令牌完成 HTTP 身份验证过程,以便从 Web 浏览器安全传输数据。
GraphQL 的安全控制不如 REST API 中的安全控制发达。为了利用 GraphQL 中的数据验证等当前功能,开发人员必须设计新的身份验证和授权技术。
REST API 使用 URI 和 HTTP 技术,这使得 API 很难预测在联系新端点时会发生什么。REST 中缺少指定的版本控制要求允许提供者采用他们自己的方法。
使用 GraphQL,您可以向您的 API 发送请求并接收准确的响应,而无需进一步添加。因此,来自 GraphQL 查询的极其可预测的响应提供了良好的可用性。GraphQL 采用了一种直接的方法并且不对 API 进行版本控制。
开发人员只需一次 API 请求即可使用 GraphQL 获取数据。为了避免数据获取不足和过度获取,灵活的样式定义了信息请求的结构,并从服务器返回相同的结构。
与 GraphQL 相比,REST API 具有严格的数据结构,可能首先返回不相关的信息(过度获取)。由于请求需要时间才能到达正确的数据并提供相关信息,因此开发人员必须进行多次调用。
REST API 的所有 GET 端点都可以缓存在服务器上或通过 CDN。它们也可以由客户端存储以供经常使用,并由浏览器缓存。GraphQL 通过单个端点提供,通常是 (/graphql),并且与 HTTP 规范不同。因此,无法像 REST API 那样缓存查询。
但是,由于可用的工具,客户端缓存优于 REST。一些使用缓存层的客户端(Apollo Client,URQL)使用 GraphQL 的模式和类型系统,允许它们在客户端保留缓存。
每个 GraphQL 请求、成功或错误都会返回 200 状态代码。与 REST API 相比,这是一个明显的区别,在 REST API 中,每个 状态代码都指向某种类型的响应。
Status Code | REST | GraphQL |
---|---|---|
200 | Ok | Ok |
400 | Bad Request | - |
401 | Unauthorized | - |
REST API 的错误可以有 200 以外的任何代码,处理错误的客户端应该知道所有可能的代码。
GraphQL 中的任何合法答案都应该是 200,包括数据和错误响应。客户端工具将有助于更有效地管理错误。错误作为特定错误对象下的响应主体的一部分进行处理