GraphQL 是一种用于 API 的查询语言,它可以帮助前端开发人员更高效地获取数据。然而,许多现有的应用程序都是基于 REST API 构建的,因此如何将 GraphQL 与 REST API 集成是一个值得探讨的话题。
在本文中,我们将介绍如何编写兼容 REST API 的 GraphQL 查询,并提供相关示例代码和指导意义。
REST API 与 GraphQL 的差异
REST API 和 GraphQL 有许多不同之处。其中最显著的区别是 REST API 基于 URL 和 HTTP 方法,而 GraphQL 使用单一入口点和查询语言。
REST API 的 URL 表示资源的地址,而 HTTP 方法表示对该资源执行的操作。例如,使用 GET 方法获取资源,使用 POST 方法创建资源,使用 PUT 方法更新资源,使用 DELETE 方法删除资源。
GraphQL 通过单个入口点(通常是 /graphql)接受查询,并使用查询语言来描述所需的数据。查询语言允许客户端指定其需要的数据,而不是由服务器决定返回什么。
兼容 REST API 的 GraphQL 查询编写方法
为了兼容 REST API,我们需要将 REST API 的 URL 和 HTTP 方法映射到 GraphQL 查询。我们可以使用 GraphQL 的自定义解析器来实现这一点。
以下是一个示例 REST API:
GET /api/users // 获取所有用户 GET /api/users/:id // 获取单个用户 POST /api/users // 创建用户 PUT /api/users/:id // 更新用户 DELETE /api/users/:id // 删除用户
我们可以使用以下 GraphQL 查询来映射上述 REST API:
-- -------------------- ---- ------- ---- ----- - ------ ------ -------- ----- ---- - ---- -------- - ----------------- ------------------ ---- -------------- ---- ------ ------------------ ---- -------------- ----- ---- - ----- --------------- - ----- ------- ------ ------- - ----- --------------- - ----- ------ ------ ------ - ---- ---- - --- --- ----- ------- ------ ------- -
在上面的代码中,我们定义了 Query 和 Mutation 类型来映射 REST API 的 URL 和 HTTP 方法。我们还定义了 User 类型来表示用户对象。
对于每个 REST API,我们都定义了相应的查询或变异。例如,users 查询对应于 GET /api/users,user 查询对应于 GET /api/users/:id,createUser 变异对应于 POST /api/users,updateUser 变异对应于 PUT /api/users/:id,deleteUser 变异对应于 DELETE /api/users/:id。
我们还定义了 CreateUserInput 和 UpdateUserInput 输入类型,用于表示创建和更新用户时的输入数据。
示例代码
以下是使用 Node.js 和 Express 实现的示例代码:
-- -------------------- ---- -------
----- ------- - -------------------
----- - ----------- - - ---------------------------
----- -
--------------
------------------
------------
---------------
--------------
----------
- - -------------------
----- --- - ----------
----- ----- - -
- --- ---- ----- -------- ------ ------------------- --
- --- ---- ----- ------ ------ ----------------- --
- --- ---- ----- ---------- ------ --------------------- --
--
----- -------- - --- -------------------
----- -------
------- -
--- - ----- ------------------------- --
----- - ----- ----------------------------- --
------ - ----- ----------------------------- --
--
---
----- ------ - --- ---------------
------ --- -------------------
----- --------
------- -
------ -
----- ----------------------
-------- -- -- ------
--
----- -
----- ---------
----- -
--- - ----- ------------------------- --
--
-------- --- - -- -- -- --------------- -- ------- --- ----
--
--
---
--------- --- -------------------
----- -----------
------- -
----------- -
----- ---------
----- -
------ - ----- ----------------------------------- --
--
-------- --- - ----- -- -- -
----- ---- - - --------- --- ------------------- - -- --
-----------------
------ -----
--
--
----------- -
----- ---------
----- -
--- - ----- ------------------------- --
------ - ----- ------------------- --
--
-------- --- - --- ----- -- -- -
----- ----- - -------------------- -- ------- --- ----
-- ------ --- --- -
----- --- ----------- ---- -- ----- --- --------
-
----- ---- - - ---------------- -------- --
------------ - -----
------ -----
--
--
----------- -
----- ---------
----- -
--- - ----- ------------------------- --
--
-------- --- - -- -- -- -
----- ----- - -------------------- -- ------- --- ----
-- ------ --- --- -
----- --- ----------- ---- -- ----- --- --------
-
----- ---- - -------------
------------------- ---
------ -----
--
--
--
---
---
------------------- -------------
-------
--------- -----
----
---------------- -- -- -
------------------- ------- -- ------------------------
---在上面的代码中,我们定义了一个 UserType 类型,表示用户对象。我们还定义了一个 schema,包含 Query 和 Mutation 类型。
我们使用 express-graphql 中间件将 GraphQL API 添加到 Express 应用程序中。
指导意义
在使用 GraphQL 与现有的 REST API 集成时,需要考虑以下几点:
- GraphQL 查询应该与现有的 REST API URL 和 HTTP 方法对应。
- GraphQL 查询应该使用自定义解析器来实现与 REST API 的集成。
- GraphQL 查询应该定义输入类型,以表示创建和更新资源时的输入数据。
- GraphQL 查询应该定义错误处理,以处理 REST API 返回的错误信息。
在实现 GraphQL 与现有 REST API 的集成时,需要仔细考虑这些因素,并确保 GraphQL 查询与现有 REST API 兼容。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67d3fc9ba941bf713478c9cd