利用 GraphQL 和 RESTful API 构建更好的 API 服务

AI 编程助手,豆包旗下的编程助手,提供智能补全、智能预测、智能问答等能力,节省开发时间,释放脑海中的创造力,支持 VSCode,点击体验 AI

在 Web 开发领域,API 是不可或缺的一部分。API 提供了一种标准化的方式,让开发者可以通过网络调用服务端的数据和功能。RESTful API 是目前最为流行的一种 API 设计模式,但是它也存在着一些不足。GraphQL 作为一种新兴的 API 技术,可以弥补 RESTful API 的不足之处。本文将介绍如何利用 GraphQL 和 RESTful API 构建更好的 API 服务。

GraphQL vs RESTful API

RESTful API 是一种基于 HTTP 协议的 API 设计模式,它使用 HTTP 动词(GET、POST、PUT、DELETE 等)来操作资源。RESTful API 遵循资源和行为的分离原则,即把 API 中的资源和行为分别处理。RESTful API 的设计原则清晰明了,易于理解和实现。

但是 RESTful API 也存在着一些不足。其中最为明显的一个问题就是过度获取资源。当我们需要获取某个资源的多个字段时,RESTful API 只能使用多次请求的方式获取所有字段的值。这种方式效率低下,而且也容易出现冗余数据。

GraphQL 是一种新兴的 API 技术,它使用一种强类型的查询语言来描述 API 的形式和数据。GraphQL 更加灵活,可以在一个请求中获取多个资源的多个字段,从而减少了网络请求次数。同时,GraphQL 还可以根据客户端需要动态决定返回哪些字段,这也减少了数据冗余。

因此,我们可以利用 GraphQL 和 RESTful API 结合起来,构建更加灵活和高效的 API 服务。

利用 GraphQL 和 RESTful API 结合

下面我们将演示如何利用 GraphQL 和 RESTful API 结合构建一个简单的 API。我们以一个电影列表应用为例,实现一个获取电影列表和电影详情的 API 接口。

RESTful API

首先我们来设计一个基于 RESTful API 的电影列表接口。我们使用 Express 框架来实现 RESTful API 的路由和逻辑:

----- ------- - -------------------
----- --- - ----------

----- ------ - -
  ---- -- ------ ---- --------- ------------ --------- ------ ---------- ----- ------
  ---- -- ------ ---- ----------- --------- -------- ---- --------- ----- ------
  ---- -- ------ ---- ---- -------- --------- ------------ ------- ----- ------
--

------------------ ----- ---- -- -
  -----------------
---

---------------------- ----- ---- -- -
  ----- ----- - ------------- -- ---- --- -----------------------
  ----------------
---

---------------- -- -- -
  ------------------- ------- -- ------------------------
---

上面的代码实现了两个 API 接口:

  • /movies:获取所有电影列表。
  • /movies/:id:根据 id 获取指定电影的详情。

我们可以使用 Postman 或者浏览器来测试这两个接口。例如,通过访问 http://localhost:3000/movies 可以获取所有电影的列表数据。

GraphQL

接下来我们来设计一个基于 GraphQL 的电影列表接口。我们使用 Apollo Server 来实现 GraphQL 的路由和逻辑:

----- - ------------- --- - - ---------------------------------
----- ------- - -------------------
----- --- - ----------

----- ------ - -
  ---- -- ------ ---- --------- ------------ --------- ------ ---------- ----- ------
  ---- -- ------ ---- ----------- --------- -------- ---- --------- ----- ------
  ---- -- ------ ---- ---- -------- --------- ------------ ------- ----- ------
--

----- -------- - ----
  ---- ----- -
    --- ----
    ------ -------
    --------- -------
    ----- ----
  -

  ---- ----- -
    ------- ---------
    --------- ------ ------
  -
--

----- --------- - -
  ------ -
    ------- -- -- -------
    ------ --- - -- -- -- ------------- -- ---- --- ----
  --
--

----- ------ - --- -------------- --------- --------- ---

------------------------ --- ---

---------------- -- -- -
  ------------------- ------- -- ------------------------
---

上面的代码使用 GraphQL Schema 定义了一个 Movie 类型,包含电影的 id、title、director 和 year 四个字段。同时定义了一个 Query 类型,包含获取所有电影列表和获取指定电影详情的两个操作。

在 resolvers 中,我们实现了两个 Query 操作。在 movies 操作中,直接返回 movies 数组;在 movie 操作中,通过 id 查找指定的电影对象。

结合 RESTful API 和 GraphQL

现在我们可以将以上两个示例代码结合起来,来实现一个既能够通过 RESTful API 获取电影列表和电影详情,又能够通过 GraphQL 获取相同数据的 API。我们可以先实现一个基于 RESTful API 的电影服务类:

----- ----- - ----------------------

----- ------------ -
  ----- ----------- -
    ----- --- - ----- --------------------------------------
    ----- ---- - ----- -----------
    ------ -----
  -

  ----- ------------ -
    ----- --- - ----- --------------------------------------------
    ----- ---- - ----- -----------
    ------ -----
  -
-

-------------- - -------------

通过别的代码可以调用该类的方法,来获取 Restful API 的数据。

接下来我们构建一个查询解析器,判断那个 API 被调用,从而调用指定的方法:

----- - -------------- - - ----------------------------------

----- -------- ------- -------------- -
  ------------- -
    --------
    ------------ - -------------------------
  -

  ----- ----------- -
    ----- --- - ----- -------------------
    ------ ------------- -- --
      --- ---------
      ------ ------------
      --------- ---------------
      ----- -----------
    ----
  -

  ----- ------------ -
    ----- --- - ----- -------------------------
    ------ -
      --- -------
      ------ ----------
      --------- -------------
      ----- ---------
    --
  -
-

-------------- - ---------

最后将上述服务类和查询解析器组合到 ApolloServer 的上下文 ctx 中,这样在 resolver 中就可以直接访问服务类的方法获取 Restful API 的数据。

----- - ------------- --- - - ---------------------------------
----- ------- - -------------------
----- -------- - -----------------------
----- ------------ - ---------------------------

----- --- - ----------

----- -------- - ----
  ---- ----- -
    --- ----
    ------ -------
    --------- -------
    ----- ----
  -

  ---- ----- -
    ------- ---------
    --------- ------ ------
  -
--

----- --------- - -
  ------ -
    ------- --- --- - ----------- -- -- ---------------------------------
    ------ --- - -- -- - ----------- -- -- ----------------------------------
  --
--

----- ------ - --- --------------
  ---------
  ----------
  ------------ -- -- --
    --------- --- -----------
    ------------- --- ---------------
  ---
---

------------------------ --- ---

---------------- -- -- -
  ------------------- ------- -- ------------------------
---

上述代码利用了 ApolloServer 提供的 dataSources 功能,将服务类和查询解析器注入到 resolver 中,从而实现了 RESTful API 和 GraphQL 的结合使用。

结论

GraphQL 和 RESTful API 都是很好的 API 技术,各有优缺点。在实际项目中,我们可以根据具体需求和场景选择合适的 API 技术来使用。如果需要更加灵活和高效的数据获取方式,可以考虑使用 GraphQL;如果需要更加清晰明了的 API 设计模式,可以使用 RESTful API。同时,也可以结合使用两者的优点,构建更加完善和高效的 API 服务。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/67177a0cad1e889fe221bf70


猜你喜欢

  • GraphQL 中如何利用错误处理器来处理异常?

    GraphQL 是一种用于构建 API 的查询语言,它可以让客户端按需获取数据,从而避免传统 REST API 中的过度获取数据的问题。然而,由于 GraphQL 的语法和设计方式与传统的 REST ...

    21 天前
  • ES9 中的 rest 参数如何解决 “callee” 不可用的问题

    在 ES5 之前,可以使用 arguments.callee 获取函数自身的引用。然而,由于 callee 是一个非标准的特性,且在 strict mode 下会被禁止使用,因此在 ES5 引入了 r...

    21 天前
  • RESTful API 中使用 JWT 进行身份验证的方法

    RESTful API 是一种常用的 Web API 设计风格,它允许客户端使用 HTTP 协议访问服务端提供的资源。在开发 RESTful API 的过程中,往往需要进行用户身份验证,以确保只有授权...

    21 天前
  • 如何使用 Jest 测试包含本地化字符的 Web 应用程序?

    Jest 是一个流行的测试框架,它可用于测试 JavaScript 应用程序。当涉及到包含本地化字符的 Web 应用程序时,测试可能会变得更加复杂。在本篇文章中,我们将深入探讨如何使用 Jest 测试...

    21 天前
  • Webpack Loader 常用库介绍

    在前端开发中,我们通常会使用 Webpack 来管理前端项目。Webpack 是一个模块打包工具,其核心功能是将多个模块打包成一个文件。而 Loader 则是 Webpack 中用于处理模块的转换器,...

    21 天前
  • Redis 如何处理并发访问?

    在前端开发中,访问数据库是一个很常见的操作。然而,在高并发访问的情况下,数据库的性能可能会受到严重影响。本文将介绍 Redis 如何处理并发访问,希望能为前端开发者提供指导意义。

    21 天前
  • 优化 React 应用性能的 ECMAScript 2020 方法

    React 是一个非常受欢迎的 JavaScript 库,它可以帮助我们构建高性能的用户界面。然而,在使用 React 时,可能会遇到性能问题,这可能会导致应用程序变得缓慢或不稳定。

    21 天前
  • Material Design 的工作原理及开发技巧详解

    前言 Material Design 是一种由 Google 所推出的设计语言,旨在通过现代的交互体验和美学展示出令人愉悦的功能。它致力于提供一种有层次感的体验,并促进设计元素之间的和谐匹配和直观性。

    21 天前
  • Next.js 如何解决服务端渲染和客户端渲染的差异问题?

    前言 服务端渲染和客户端渲染是前端开发中的两个重要概念。服务端渲染将页面在服务器端预先渲染,然后将渲染好的页面发送给客户端,这样用户在访问网站时能够快速看到内容。而客户端渲染则是在客户端浏览器中通过 ...

    21 天前
  • GraphQL 的自省及其应用场景

    GraphQL 是一种具有强大查询语言的 API,其自省功能使其具有更多的可能性。GraphQL 的自省能力让开发人员能够深入了解其服务端 API 的结构,并根据其服务端结构定制客户端。

    21 天前
  • Vue.js: 解决在 v-model 中使用自定义组件无法绑定数据的问题

    在 Vue.js 中,使用 v-model 指令可以将数据双向绑定到表单元素或自定义组件中。然而,当我们想在 v-model 中使用自定义组件时,可能会遇到一个问题,那就是无法绑定数据。

    21 天前
  • 解决 SPA 应用中图片加载问题的最佳实践教程

    在单页面应用 (SPA) 中,图片加载的问题常常被忽略,但其实这是一个非常重要的问题。因为在 SPA 中,页面只加载一次,所有的页面切换都是通过 JavaScript 来实现的,如果没有使用合适的图片...

    21 天前
  • 如何在 Cypress 中集成测试报告并实现自动邮件推送

    如何在 Cypress 中集成测试报告并实现自动邮件推送? Cypress 是一个基于 Node.js 的端到端测试框架,旨在提供友好的 API,丰富的断言和快速稳定的执行。

    21 天前
  • 如何在 Hapi 中实现 AOP 编程

    AOP(面向切面编程)是一种编程思想,可以将需要横跨多处的代码功能抽离成模块化的切面,以便在运行时动态地组合到应用中。在前端开发中,AOP 通常用于需要注入第三方 SDK 或者其他不属于应用逻辑范畴的...

    21 天前
  • 响应式设计中如何实现网格布局

    在现代web开发中,响应式设计已经成为了一种通用的设计模式。随着越来越多的设备参与进来,我们需要为不同尺寸的屏幕和设备提供更好的用户体验。当今的网页设计已经远离固定的布局且趋向于灵活自适应的网格布局。

    21 天前
  • Sequelize ORM 实践技巧:如何处理异步调用问题

    随着前端技术的不断发展,后端业务也越来越需要前端技术的支持。Sequelize ORM 是一款流行的 Node.js 数据库 ORM 工具,多数后端开发者选择使用它来操作数据库。

    21 天前
  • 如何在Material Design中自定义Dialog风格

    Material Design是一种由谷歌推出的设计语言,它强调直观、统一和有层次感的设计风格,成为越来越多Web和移动应用开发者的选择。其中Dialog是其中一种基本元素,通常用于弹出提示对话框或交...

    21 天前
  • 如何使用 Vue.js 构建响应式的 SPA 应用

    Vue.js 是一个流行的 JavaScript 框架,它提供了许多工具和能力,可以帮助你构建现代化的应用程序。在本篇文章中,我们将讨论如何使用 Vue.js 构建响应式的 SPA(单页应用)应用程序...

    21 天前
  • Mongoose 中的数据复制方法

    Mongoose 是 Node.js 的一种优秀的 MongoDB 驱动程序,它提供了易于使用的 API 和强大的数据库查询功能。当我们需要在一些操作中进行数据复制时,Mongoose 提供了几个方法...

    21 天前
  • 如何使用Tailwind CSS实现响应式表格布局

    Tabular数据是许多应用程序中必不可少的一种数据类型,因此良好的表格布局对于提高数据可读性和用户体验来说至关重要。在这篇文章中,我们将介绍如何使用Tailwind CSS框架来实现响应式表格布局。

    21 天前

相关推荐

    暂无文章