About

GraphQL 与 REST:它们有何不同?

Author Tanmer Tanmer
Tanmer · 2025-06-11发布 · 7 次浏览

本文探讨了 REST 和 GraphQL 两种 Web API 技术之间的主要区别,包括数据获取方式、灵活性和性能等方面的比较。

https://document360.com/blog/graphql-vs-rest-api/

REST 和 GraphQL 是用于构建 Web API 并定义客户端和 API 服务器之间交互的技术。然而,两者的比较并不一定是同类的。 REST 是一种 API 架构风格,而 GraphQL 是一种 API 查询语言和运行时。

最显着的区别是客户端获取数据的方式。例如,REST 和 GraphQL 的不同之处在于它们如何公开数据、客户端如何应用过滤器以及客户端如何接收和解析响应。

本文将讨论 REST 和 GraphQL 之间的差异及其用例。

什么是休息?

REST(表述性状态传输)是一种架构风格,它对如何构建 Web API 施加了限制。 REST 的一个定义特性是它使用资源 URL 向客户端公开数据对象。我们在另一篇博文《REST 与 SOAP:有什么区别?》中深入探讨了 REST。

讨论 Web API 就必须提到 REST。 REST 是 Web API 最广泛采用的 API 架构,也是连接微服务架构中组件最常用的 API 类型。由于其广泛采用,REST 拥有更丰富的工具和框架生态系统,并内置对 REST 的支持。

什么是 GraphQL?

Facebook 开发了 GraphQL 来解决 REST 的一些缺点。 GraphQL 的卖点是其数据请求方式的灵活性。使用 GraphQL,客户端可以构造查询来过滤和构建响应数据。

相比之下,REST 具有预定义的响应,在请求中传递参数只会对这些响应产生最小的影响。

GraphQL 更简单,因为您的应用程序不需要跟踪它想要检索或操作的每个数据对象的所有资源 URL。相反,它可以使用一个 URL 来查询所需的数据。

请求数据比 REST 更高效,因为您只能检索所需的数据。相反,REST 通常涉及“过度获取”和“不足获取”。

由于您可以在查询中构造数据,因此开发人员可以花费更少的时间来解析响应。 REST 严格的响应结构需要更多的解析策略,并且通常需要进行格式化,以便您的应用程序可以使用它。 GraphQL 允许您构建查询的 JSON 响应以符合应用程序的期望。

最后,对于复杂的应用程序,GraphQL 比 REST 更有效。

它们有何不同?

REST 和 GraphQL 之间的主要区别在于客户端获取数据的方式。

REST API通过资源 URL 公开数据。因此,收集数据可能涉及向单独的资源发送请求。这种限制称为“获取不足”。当您无法收到所需的所有信息时,就会出现获取不足的情况。

相反,REST 严格的响应结构可能会导致“过度获取”。当客户端在响应中获取的数据多于其需要时,就会发生过度获取。

GraphQL 以不同的方式公开数据。客户端将数据查询发送到 API 的一个 URL。因此,使用 GraphQL 收集所需的数据可能需要更少的请求。

REST 和 GraphQL 都提供了通过传递参数来过滤响应的方法。然而,GraphQL 的查询提供了更大的灵活性。 GraphQL 作为一种查询语言,允许您过滤响应以精确获取您需要的数据。您构建查询的方式决定了 API 如何构建响应。在 REST 中,您无法控制响应的结构。相反,API 定义了 JSON 属性的顺序。

GraphQL 的缺点是您必须密切了解您使用的 GraphQL 架构。

请求示例:REST 与 GraphQL

我们将比较 REST 和 GraphQL 请求以展示它们如何获取数据。两个假 API(一个用于 REST,一个用于 GraphQL)将返回相同的数据。 API 允许您通过提供 userId 来检索用户详细信息。

REST – 获取超出需要的数据(过度获取)

下面是在一个简单的 Web 应用程序中使用普通 JavaScript 向名为 fake_rest_api 的虚假 REST API 发出的示例请求。

fetch("https://fake_rest_api.com/user/86", {
方法:“获取”,
})
.then((响应) => response.json())
.then((数据) => {
控制台.log(数据);
});

该请求将 fetch() 方法中的资源 URL 传递给根据 userId 返回用户信息的资源。您希望检索相关数据的用户的 userId 将作为资源 URL 中的路径参数传递(如 /86)。该请求指定对资源采取的方法或 CRUD 操作。在这种情况下,GET 方法告诉 API“检索”数据,而不是创建、更新或删除数据。

该请求返回一个 JSON 对象,如下所示:

{
“ID”:86,
“用户名”:“doeUser”,
“名字”:“约翰”,
“姓氏”:“多伊”,
“电子邮件”:“johndoes@gmail,com”,
“密码”:“8625”,
“电话”:“3348439878”,
“用户状态”:0
}

正如您所看到的,JSON 包含 userId:86 的用户的所有内容。但是,如果我们只想检索用户的用户名和电子邮件怎么办?如果您还记得的话,REST API 决定了响应。 API 开发人员决定不允许客户端仅过滤用户对象中所需的字段。

作为客户端应用程序,您现在拥有的数据超出了您的需要(“过度获取”)。由于有效负载大小增加,过度获取会影响性能。此外,如果 API 返回的数据对象是,大量且频繁的请求会对性能产生负面影响。

对于此 REST API,您也可以不定义返回的 JSON 对象中的属性顺序。用户对象遵循 API 指定的严格格式。由于您无法指定响应的结构,因此您的应用程序必须构建它在响应中接收到的数据。

GraphQL:仅获取所需的数据

接下来,我们将向 GraphQL API fake_graphql_api 发送类似的请求,以展示 GraphQL 的灵活性。

首先,我们将 API uri(基本上是一个 URL)保存到一个名为 client 的变量中,稍后我们将访问该变量。

const client = new ApolloClient({uri: 'https://fake_graphql_api.com/',
});

请注意,我们提供 API 的基本 URL 作为 uri 属性的值。没有单独的 /user 资源 URL。使用 GraphQL,客户端仅使用基本 URL 访问数据对象。您如何指定要检索有关哪个用户的详细信息将在查询中传递(我们将在稍后介绍)。

现在,让我们使用普通 JavaScript 构建请求来检索用户详细信息。

客户
。询问({
查询:gql`
查询用户(id:84){
用户名
电子邮件
}
`,
})

.then((结果) => console.log(结果));

现在忽略请求的整体结构。代码的关键部分是包含在 gql 模板文字中的查询字符串:

查询用户(id:86){
用户名
电子邮件
}。

与 REST API 一样,您可以传递 userId 以返回该用户的数据。等效的 GraphQL 请求涉及结束名为 user(操作名称)的查询(操作类型),该查询将 id 86 作为参数传递。

我们的应用程序只需要用户名和电子邮件,而不需要属于用户对象的其他字段。使用 GraphQL,可以从用户数据对象请求特定字段。如果您还记得的话,REST API 没有提供过滤用户数据并返回所有用户详细信息的方法。

使用 GraphQL,您可以过滤数据并在请求中定义其结构。

{
“数据”: {
“用户”:{
“用户名”:“doeUser”
“电子邮件”:“johndoes@gmail,com”
}
}
}

如果您查看上面的查询结构和响应 JSON 结构,您会发现基本结构是相同的。

使用 GraphQL,响应将准确包含您请求的数据,不多也不少。

您请求的数据的顺序将保持不变,电子邮件显示在用户名后面。在 REST API 中,API 确定属性的顺序。

REST:从多个资源获取数据(获取不足)

现在,假设我们正在构建一个博客应用程序。每个用户都会撰写博客文章。假设我们要检索同一用户撰写的所有博客文章的标题。

REST API 有两个端点:一个用于检索称为 /user 的用户详细信息(我们之前向其发送请求的端点),另一个称为 /posts,它允许您检索有关用户撰写的文章的数据。

在本例中,对 /users 资源的请求是获取不足的一个示例,因为我们需要从该资源获取所有数据。

我们必须向 /posts 资源发送第二个请求。此资源允许您传递可选的 userId 以将帖子列表过滤为仅显示用户写入的帖子。

fetch("https://fakerestapi.com/posts?userId=86", {
方法:“获取”,
})
.then((响应) => response.json())
.then((数据) => {
控制台.log(数据);
});

GraphQL:从单个资源获取数据

对于 GraphQL API,我们不需要发送单独的请求来检索用户的博客文章。相反,我们可以向 API 的 uri 发送 HTTP 请求,并指定我们需要用户详细信息以及他们在同一查询中撰写的文章。

客户
。询问({
查询:gql
查询用户(id:84){
用户名
电子邮件
帖子{
标题
}
}
,
})

.then((结果) => console.log(结果));

我们在上面的代码片段中向查询添加了一个 posts{} 对象。在 posts{} 中,我们指定需要所有用户帖子的标题。

使用 GraphQL,我们可以通过一次请求请求我们需要的所有数据。回顾过去,REST 需要向两个资源 URL 发出请求:一个用于 /users,另一个用于 /posts。 GraphQL 允许您通过一个请求请求所需的所有数据,从而防止了获取不足的情况。

免责声明

在前面的示例中,我可能削弱了 REST 的功能来说明 GraphQL 的灵活性。

REST 提供了使用参数过滤数据的方法。例如,REST API 可能已指定您可以在响应中传递所需的字段。但是,当然,您无法控制响应的结构;它表明您可以以有限的方式影响响应。

前面示例的要点是您可以使用 REST 和 GraphQL 来检索相同的数据。影响 REST API 响应的可能性由 API 开发人员自行决定。 GraphQL 为 API 用户提供了更多选项来定义字段之间的关系,并按照应用程序期望的数据准确地构建响应。

准备好将您的 API 文档提升到新的水平了吗?今天和巴克利布一起!

差异深入探讨

现在我们知道了两者在实践中的区别,让我们更深入地研究这些区别。

成分

休息

  • *资源– API 公开的数据对象,客户端可以检索和操作。每个资源都有一个唯一的资源 ID,客户端使用该 ID 来访问该资源。

    • HTTP 方法– 这些方法相当于标准 CRUD 操作。每个操作代表对资源采取的特定操作。

    • 表示形式– REST 提供多种消息格式,例如 JSON、HTML、YAML、XML 和纯文本。

    • 无状态——客户端应用程序处理数据,而不是服务器。服务器不跟踪请求;每个请求都独立于过去的请求。客户端必须管理应用程序状态。

GraphQL

  • *服务器实现– GraphQL API 服务器提供客户端发送查询的 URL,并具有收集数据和发送响应的解析器功能。

    • 数据源– 数据源是包含 API 所操作的数据的位置。数据源包括数据库、文件系统或从另一个 API 检索数据的 Web 服务。

    • 架构– API 的架构定义所请求的数据、可用操作、字段以及字段之间的潜在关系。

    • 客户端实现——客户端通过构造 GraphQL 查询来实现 GraphQL。

运营

休息

正如简要讨论的那样,HTTP 方法与 API 请求一起发送,以指示您想要对资源执行的操作。 API方法有很多,我只列出一些重要的:

  • * POST 请求 –创建资源。

    • GET 请求– 检索有关资源的信息。

    • PUT 请求– 更新或创建资源。

    • DEL 请求– 删除资源。

GraphQL

  • *查询——查询是对服务器数据的请求。查询是一种将数据对象过滤为仅包含您需要的字段的方法。查询是 GET 请求的更灵活版本,您可以在其中检索数据。

    • 突变– 如果查询类似于 REST 的 GET 方法,则突变是用于修改数据对象的其余 CRUD 操作(方法)。变异操作类型操作并返回数据。

    • 订阅– 此操作类型允许您指定要触发的实时事件或数据更改。示例包括实施提要、聊天室等。

数据获取

休息

  • *构造请求– 指定包含请求中所需数据的特定端点。

    • 发送请求– 使用特定于客户端编程语言的工具或库来发送请求。

    • 接收响应– 响应正文包含请求的数据。状态代码指示请求是成功还是失败。

    • 解析响应– 应用程序必须解析并格式化响应正文。

GraphQL

  • * 客户端在查询中发送数据请求,指定 API 的 uri 的确切数据。您通常使用一个库将 GraphQL 功能添加到您的 Web 应用程序中。

    • GraphQL 函数将查询中的字段映射到源中的数据并返回数据。

    • GraphQL 函数组合源中的数据、应用业务逻辑并执行计算。

社区

两者都有强大的社区。然而,REST 的存在时间更长,采用更广泛,因此可以使用更多资源,例如教程、博客、文档和用户论坛。

GraphQL 的社区稳步发展。资源包括 GraphQL.org、GraphQL Weekly、GraphQL Summit 以及 GraphQL 库和工具。

表现

两者都针对高性能进行了优化。 GraphQL 比 REST 具有更高的性能,因为它减少了过度获取和不足获取。然而,GraphQL 确实需要通常复杂的服务器端实现。因此,API 开发人员必须仔细定义架构并优化查询以避免性能问题。

开发速度

虽然 GraphQL 更适合复杂的 API,但 REST 的简单性和开发人员的熟悉度可以在最初加快开发速度。

切换到 GraphQL 可能会涉及一个学习曲线。您的团队对每种技术的熟悉程度是一个因素。最后,复杂的 API 比简单的 API 需要更多的时间来开发,无论它们是否使用 REST 还是 GraphQL。

文档

REST 通常依赖于解析 REST API 的开放 API 规范以生成文档的第三方工具。但是,GraphQ 支持完整的内置文档。

阅读更多:如何使用示例编写 API 文档

缓存

REST 和 GraphQL 服务器响应都是可缓存的。但是,缓存策略不同。

当客户端请求 REST API 时,API 必须指示可以或不可以缓存响应。此外,它还必须显示客户端可以缓存响应多长时间。缓存可以通过减少 API 请求数量来提高可用性和性能,因为客户端可以利用特定时间的缓存数据。

对于 GraphQL,您必须缓存各个字段,因为捕获整个 GraphQL 查询响应是不可行的。因此,您需要更精细的控制才能有效地缓存响应。因此,最好有一个 GraphQL 的缓存库。

另请阅读: gRPC 与 REST:有什么区别?

包起来

REST 和 GraphQL 是用于构建 Web API 的技术。例如,Facebook 创建了 GraphQL 来解决 REST 的过度获取和获取不足的问题。 GraphQL 通过允许客户端发送查询来过滤所需数据并构建响应中返回的数据来解决此问题。

虽然 GraphQL 解决了许多 REST 问题,但它不如 REST 熟悉,并且需要一个学习曲线。

处理复杂数据模型以及这些数据模型之间的关系的 API 可能更适合 GraphQL。相反,不涉及复杂数据的简单 API 可能更适合谨慎和隔离的功能。

最终,可以在 REST 之上抽象 GraphQL,从而获得这两个好处。

提交反馈

博客 博客

智能知识库,未来企业基石