3 GraphQL与REST的不同之处

在上一篇中,我们深入探讨了GraphQL的核心特点,包括它的查询语言、强类型系统以及如何通过单一端点提供灵活的数据获取方式。本文将更进一步,比较RESTGraphQL的不同之处,从而为您理解这两种API的设计理念和实际应用提供实用的视角。

数据获取方式

REST

REST架构中,数据是通过多个端点获得的。每个资源都有自己的URI,用户可以通过这些URI进行获取。例如,获取用户数据的请求可能如下:

1
GET /users/1

每个请求都可能返回固定结构的数据。假设我们想要获得用户的基本信息和相关的帖子,可能需要进行如下的两次请求:

1
2
GET /users/1
GET /users/1/posts

这种方式导致了“N+1”的问题,尤其当需要获取复杂的层级数据时,必须发起多次请求。

GraphQL

与此不同,GraphQL允许客户端以单一请求获得所需的所有数据。使用GraphQL,您可以指定您想要的数据结构。例如,要获取用户及其相关帖子的请求如下所示:

1
2
3
4
5
6
7
8
9
{
user(id: 1) {
name
posts {
title
content
}
}
}

这个请求返回的结果既包含用户的姓名,也包含其帖子标题和内容,避免了多次请求的需要,节省了网络流量和响应时间。

数据返回结构

REST

REST中,每个资源的响应结构是固定的。即使不需要某些字段,服务器也会返回全部信息。这会导致这个问题:返回的数据总是比客户端所需的要多,从而增加了数据传输的负担。

例如,对于用户请求的响应:

1
2
3
4
5
6
7
{
"id": 1,
"name": "Alice",
"email": "alice@example.com",
"createdAt": "2023-01-01T00:00:00Z",
"posts": [ ... ]
}

如果客户端只需要nameemail,则多余的信息就显得不必要。

GraphQL

GraphQL允许客户端选择所需的字段,形成灵活的查询。例如,以下GraphQL查询只请求用户的nameemail

1
2
3
4
5
6
{
user(id: 1) {
name
email
}
}

返回结果将简洁很多:

1
2
3
4
5
6
7
8
{
"data": {
"user": {
"name": "Alice",
"email": "alice@example.com"
}
}
}

这种灵活性使得GraphQL在带宽受限或数据量大时显得尤为重要。

版本管理

REST

REST中,版本控制通常是通过在URI中包括版本号来进行的,例如:

1
2
GET /v1/users/1
GET /v2/users/1

这种做法容易导致API的碎片化,增加了维护难度,因为开发者需要管理多个版本,修复bug时可能面临多条路径的问题。

GraphQL

GraphQL设计理念则不需要版本控制。一旦定义好GraphQL schema,后续可以逐步扩展功能,而不会影响已有的查询。客户端始终可以查询自己需要的数据,服务器端则可以通过添加新字段而不是更改现有字段来实现API的更新和扩展。

1
2
3
4
5
6
7
8
# 新增功能的示例
{
user(id: 1) {
name
email
age # 新增的字段
}
}

总结

通过上述比较,我们可以看到GraphQLREST在多方面的关键差异:REST的多个端点和固定的响应结构可能导致过多的请求和冗余的数据传输,而GraphQL通过灵活的查询和单一端点提供了更高的效率和可维护性。

在接下来的文章中,我们将深入探讨GraphQL的优势,探索它如何在实际应用中超越传统的REST API,帮助开发者更高效地构建和管理API。

3 GraphQL与REST的不同之处

https://zglg.work/graphql-api-dev-zero/3/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

学习下节

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论