使用哪一个以及何时使用

GraphQL 与 REST API:选择哪个以及何时使用

在构建客户端-服务器应用时,开发人员常常需要在 GraphQL 和 REST API 之间做出抉择。这种选择会对应用的运行速度、可扩展性和维护的难易程度产生重大影响。

多年以来,REST API 一直是许多开发人员的首选方案。其结构清晰明了,易于使用和理解。因此,开发人员可以轻松地利用它来构建复杂的应用。

然而,GraphQL 凭借其更高效且更具适应性的查询机制,正在成为一个强有力的竞争对手。借助 GraphQL,开发人员可以只获取他们真正需要的信息。此外,GraphQL 的数据模型支持简单的自定义。

GraphQL 和 REST API 都拥有各自独特的优势和特点。因此,为项目选择最合适的方案,将对项目的成功产生重要的影响。本文将深入探讨 GraphQL 和 REST API,包括它们的特性、优点、适用场景以及主要区别。

什么是 GraphQL?

GraphQL 是由 Meta 公司开发的一种强大的 API 查询语言。它为构建 API 和改进传统的 RESTful API 调用提供了更优的方法。

借助 GraphQL,开发人员可以使用单个端点精确地获取所需数据。这使得管理数据依赖性以及避免过度获取数据变得更加容易。而传统的 REST API 通常需要多个端点才能获取各种资源。

然而,人们对 GraphQL 的概念仍然存在一些误解。因此,让我们澄清以下几点:

  • GraphQL 不是一种数据库语言或 ORM,而是一种用于查询 API 的工具。
  • GraphQL 并非旨在取代 REST API,而是一种可以与 REST API 在同一项目中并存的替代方案。
  • GraphQL 并非难以理解或过于复杂,因此易于学习和实施。

GraphQL 于 2015 年作为开源项目发布。自那时起,诸如 GitHub、Yelp 和 Shopify 等公司都纷纷采用它,使其越来越受欢迎。随着对更高效 API 的需求不断增长,GraphQL 正在逐渐成为开发人员需要掌握的关键技能。

GraphQL 的工作原理

GraphQL 基于一个模式,该模式详细描述了可以查询的数据类型及其关系。该模式充当客户端和服务器之间的桥梁,确保双方都清楚可以请求哪些数据,并且还决定了数据的呈现方式。

我们以一个使用 GraphQL API 的博客应用为例。该 API 的模式可以描述如下:

在此模式中,定义了帖子 (Post) 和评论 (Comment) 类型,以及查询类型。 这使得我们可以通过 ID 获取单个帖子。每种类型所包含的字段反映了可以获得的数据。

利用此模式,我们可以使用以下代码创建一个 GraphQL 查询来获取帖子及其评论:

此查询的结果将包含帖子的标题、正文、作者和 ID,以及与该帖子相关的任何评论的正文和作者。

我们可以使用 GraphQL 通过一次 API 调用来获取所有必要的数据,而无需向不同的端点发送多个查询。 如此一来,开销减少,API 的效率得到提升。

什么是 REST API?

REST API 是一种用于构建 Web 服务的架构风格。它支持通过 HTTP 协议在多个系统之间进行通信。REST API 是一组架构原则,有助于开发可扩展、高效且通用的 Web 服务。

它在开发人员中很受欢迎,因为它使用常见的 HTTP 方法,例如:

GET:用于获取资源。

POST:用于创建资源。

PUT:用于修改或更新资源的状态,可以是对象、文件或数据块。

DELETE:用于删除资源。

REST API 的核心是资源的概念,每个资源都由一个唯一的 URL(统一资源定位符)来标识。 根据客户端的请求,每个资源可以有不同的表示形式,例如:

  • JSON(JavaScript 对象表示法)
  • XML(可扩展标记语言)
  • HTML(超文本标记语言)

RESTful API 利用这些资源来检索数据、创建记录、更新记录或删除记录。

REST API 的工作原理

REST API 的工作原理是允许用户向服务器发送 HTTP 请求,其中 URL 描述资源。服务器处理请求后,会以指定的格式(如 JSON 或 XML)返回信息。

例如,考虑一个允许用户访问某本书相关信息的 Web 应用程序。 使用 RESTful API,客户端可以获得关于单本书或一系列书籍的详细信息。

要获取特定书籍的信息,客户端会使用资源 URL 发送 HTTP GET 请求。 该链接可能如下所示:https://example.com/api/books/123。 在处理请求并找到 ID 为 “123” 的书籍后,服务器会以所选格式(例如 JSON)发送响应。

同样,要获取书籍列表,客户端会向服务器发送 HTTP GET 请求,其中包含一个 URL,例如“https://example.com/api/books”。服务器会以所需的格式(例如 JSON)进行响应。

GraphQL 的特点

GraphQL 是一种通用且高效的查询语言,因为它提供了强大的类型系统和分层的数据检索功能。以下是 GraphQL 的一些关键特性,这些特性使其广受欢迎:

强类型:GraphQL 提供了一个模式,其中包含了 API 可以访问的各种数据类型,如字段、对象和链接。为了确保合法的数据传输,此模式用于验证查询和回复。

层次结构:GraphQL 允许客户端指定他们需要的确切数据。因此,返回的冗余数据较少,从而提高了 API 的速度。

更高效:借助 GraphQL,客户端可以通过一次请求获取大量资源。它仅对所有允许缓存和批处理请求的查询使用一个端点。

以客户端为中心:GraphQL 允许客户端控制获取的数据,从而减少了对服务器的调用次数。

与技术无关:由于 GraphQL 独立于底层数据库和技术堆栈,因此它可以与任何后端技术集成。

内省:GraphQL 具有内省系统,使客户端能够了解它们可以访问的数据、数据类型和链接。

订阅模式:订阅模式允许用户获得实时数据更新。客户端可以订阅某些数据的更改,并在数据发生更改时得到更新。

现在您已经了解了 GraphQL 的特性,让我们来探讨一下 REST API 为其用户提供的功能。

REST API 的特点

REST API 非常强调遵循一组标准,这些标准使 API 具有高度的可访问性、适应性和可扩展性:

无状态:RESTful API 在每个请求中包含所有必要的数据。因此,它是无状态的、可扩展的并且易于管理。

客户端-服务器架构:采用客户端-服务器架构,客户端从服务器请求数据并返回。因此,前端和后端系统可以分开构建和维护。

基于资源:可访问的数据由资源表示。对于检索或修改,每个资源都有一个特定的 URL。

CRUD 操作:REST API 通过 CRUD(创建、检索、更新和删除)操作来管理资源。

一致的接口:提供统一的接口来与资源进行交互,从而简化 API 的架构和维护。

可缓存:启用缓存功能,从而减少对服务器的查询次数,提高效率。

分层结构:支持包含代理服务器的分层结构,从而提高灵活性和可扩展性。

GraphQL 的优势

在了解了 GraphQL 的特性之后,让我们来看看它脱颖而出的优势。

更好的性能:通过最大限度地减少通过网络传输的数据量来提高性能。

简化的 API 开发:使用单个包含模式,API 开发变得更加容易。因此,它简化了开发过程并减少了出错的机会。

更高的灵活性:开发人员可以准确地描述他们需要的数据以及数据的组织方式。因此,它可以支持多种客户端,例如移动和 Web 应用。

改进的开发人员体验:GraphQL 提供了简化 API 的创建、测试和调试的框架和工具。

更好的文档:使用自文档化架构,可以更轻松地理解和使用 API。

更快的迭代:可以在不影响当前客户端的情况下对模式进行更新。因此,改进 API 并向其添加新功能变得更容易。

更简单的数据聚合:用户可以将来自多个 API 和来源的信息集成到单个查询中。因此,可以使用不太复杂的后端代码使数据聚合变得更简单。

REST API 的优势

REST API 提供了多种优势,使其成为开发人员和企业的热门选择。以下列出 REST API 的一些主要优点:

灵活性:XML、JSON 和 HTML 只是可以与 REST API 一起使用的多种编程语言和数据格式中的几种。

可扩展性:REST API 可以处理大量的流量和数据,使其成为分布式系统的理想选择。

无状态:REST API 是无状态的,这使得开发人员可以轻松地创建可以为许多客户端提供服务的 API。

增强的性能:通过缓存功能,服务器处理的请求减少,从而提高了整体性能。

易于实施:通过其用户友好的 HTTP 方法,很容易实施来获取、创建、更新和删除资源。

应用和用例:GraphQL

在构建和使用 API 时,GraphQL 提供了独特的解决方案。在正确使用的情况下,它可以成为以下用例的理想工具:

创建 API

GraphQL 通常用于开发提供更快访问和检索数据方法的 API。它可以帮助开发人员精确地指定他们希望查询的数据的字段和结构,从而使 API 更轻便、更快捷。

无头内容管理系统

对于无头 CMS,GraphQL 可以用作数据层。它提供了一种将内容与显示层分离的方法。此外,无头 CMS 允许开发人员有效且灵活地检索和管理内容。

移动应用开发

由于移动应用通常具有有限的带宽,因此快速数据检索变得至关重要。这就是 GraphQL 成为开发移动应用的理想工具的原因。此外,它还使开发人员更容易实现诸如离线支持和缓存等功能。

协作应用

GraphQL 的订阅特性对于需要用户参与和实时数据变化的应用来说至关重要。因此,客户端可以订阅更新并接收来自服务器的即时推送。

微服务

在微服务架构中,服务通常需要相互通信并且具有不同的数据要求。GraphQL 通过提供单个接口从各种服务检索数据来降低这种复杂性。

电子商务

GraphQL 在检索和管理产品数据方面的多功能性和高效性可以改进电子商务网站和应用。这允许动态更新产品可用性、用户特定的购物指南和特别优惠等功能。

数据科学

GraphQL 灵活而强大的数据检索和分析能力使其成为数据科学应用的可行技术。它使开发人员可以更轻松地对来自各种来源的数据进行高级分析和建模。

社交媒体

使用 GraphQL,开发人员可以查询和操作用户信息、博客文章和其他内容。这允许动态更新用户提要,并为最终用户提供更加个性化的体验。

应用和用例:REST API

以下是 REST API 的一些关键应用和用例:

移动应用

REST API 是为移动应用开发后端服务的绝佳选择。它可以轻松地从多个来源检索数据,例如数据库、云存储、在线移动服务等。

Web 应用

REST API 最适合创建需要从多个来源访问数据的 Web 应用。它提供了一种访问和操作数据的统一方法,最大限度地降低了 Web 应用的复杂性。

物联网 (IoT)

您可以利用 RESTful API 将物联网 (IoT) 设备与基于云的软件连接起来。例如,智能恒温器可以与使用 REST API 调节家庭温度的基于云的服务进行交互。

电子商务网站

为了与第三方服务进行交易和连接,电子商务网站经常使用 RESTful API。例如,在线商店可以使用 RESTful API 从物流提供商处获取运输数据或通过支付网关接受付款。

社交媒体平台

RESTful API 在促进社交媒体网络提供有组织的数据访问能力方面发挥着至关重要的作用。使用它,开发人员可以从 Twitter、Facebook 和 LinkedIn 等网站访问用户数据,以创建定制的社交媒体管理系统或原生应用。

GraphQL 与 REST API

让我们快速了解一下 GraphQL 和 REST API 之间的区别:

特点 GraphQL REST API
数据检索 客户端可以查询并仅检索所需格式的数据。 客户端可以查询并接收预定义格式的所有数据。
数据请求 可以处理复杂的数据,并使用单个请求从多个来源返回数据。 需要对大量资源进行多次查询。
数据查询灵活性 允许根据客户端的特定需求定制自适应查询。 查询的修改可能性相对受限。
缓存 启用缓存功能,可提高性能,无需重新处理查询。 由于预定义的返回样式,缓存可能更加困难。
整体性能 对高频数据检索有效。 高频数据的效率较低。
版本控制 由于对模式的更新是累积的,所以通常不需要版本控制。 可能导致带宽浪费和延迟响应时间。
学习曲线 学习曲线较为陡峭,用户必须掌握模式和查询方法。 请求和响应样式简单,更容易学习和使用。
文档 大量的工具、文档和 IDE 集成。 有限的工具、文档和 IDE 支持。
工具支持 程序、工具和库正在不断扩展。 完善和强大的工具和资源集。

作者注

GraphQL 允许客户端在单个请求中准确地获取他们所需的数据。 对于数据需求复杂或数据检索频率高的应用而言,这是一个不错的选择。

另一方面,REST API 提供了更强大的软件生态系统支持,并且更容易使用。它非常适合需要易用性的简单应用。此外,它还包括一个完善的工具和库生态系统。

总结

正如您所见,GraphQL 和 REST API 在优势和劣势上都有着明显的区别。一般来说,选择 GraphQL 还是 REST API 取决于开发人员的偏好和应用的具体需求。

您还可以了解一些常见的 REST API 面试问题和答案。