GraphQL 实践:实现基于 GraphQL 的数据地图

阅读时长 9 分钟读完

在传统的 RESTful API 中,我们通常是按照路由的方式去请求数据,在大型前端应用中,常常会出现请求路径混乱,接口版本频繁更新的问题。为了解决这些问题,谷歌出品的 GraphQL 技术,逐渐流行起来。

GraphQL 是基于 Facebook 内部使用生成的一种 API 设计语言,它不是数据存储方案,而是一种用于客户端和服务器端通信的技术方案,它定义了查询语言和一个规范的运行时。

在本文中,我们将会讲解如何通过 GraphQL 技术来实现一个数据地图,在此过程中,我们也将会提及 GraphQL 的一些精妙之处。

为什么选择 GraphQL?

GraphQL 与传统的 RESTful API 相比,有以下几个优点:

  • 快速迭代:GraphQL 可以让客户端根据需要获取所需数据的指定部分,而不是整个数据集,这样可以保持客户端和服务器端协调一致,不会浪费时间和带宽来传输不必要的数据。

  • 数据精准:GraphQL 使用直观易懂的数据模型来描述数据,可以让客户端更灵活地去请求数据详情。

  • 类型检测:GraphQL 有一个精简的类型化系统,可以让客户端和服务器端按照同样的类别来访问数据,避免了繁琐的类型转换。

  • 可伸缩性:GraphQL 基于一个标准的协议,可以让你集中你的系统和服务,减少同步和浏览器污染。

GraphQL 的基础概念

Schema

GraphQL 架构的核心是 schema。schema 描述了数据模型,定义了查询操作。schema 是一个声明式的模型,它定义了数据模型中的类型以及类型之间的关系。模式还定义了可在 API 中执行的查询、变更和订阅操作。

Resolver

Resolver 是注入了相应的数据源的函数。GraphQL 中的断言处理程序是一个函数,它接收用户定义的 GraphQL 查询,并从服务器的数据储存/源中检索数据。

GraphQL 请求

GraphQL 请求可以包含查询和变更操作,查询用于从 API 请求数据,而变更操作用于向 API 发送数据更改请求。

GraphQL 查询

GraphQL 查询由以下几个部分组成:

  • 查询字段
  • 参数
  • 返回值

例如,对于一个简单的查询:

这个查询涉及到 bookauthor 列表的数据,这些数据通过 GraphQL API 的查询操作返回。

实现基于 GraphQL 的数据地图

现在让我们来看一下如何实现基于 GraphQL 的数据地图。首先,我们需要对数据进行建模。

假设我们的数据是这样看待的:

  • 国家
  • 区域

我们可以利用 GraphQL 的 schema 来定义这些数据,这是我们的基础 schema:

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

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

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

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

要查询一个国家的数据,我们可以这样编写查询:

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

这个查询操作将会返回我们定义的国家 schema,包括国家 ID、名称、州的 ID 和名称、区域的 ID 和名称。

接下来,我们定义一些 resolver 来处理这些数据,例如一个查询国家数据的 resolver:

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

这段代码定义了数据库db中的查询和数据提取操作,其中 states 查询了某个国家下所有的州,regions 查询了某个州下所有的区域,counties 查询了某个区域下所有的县。

最后的步骤是将 these 基础信息添加到我们的常规 GraphQLServer 中,我们将使用 apollo-server 作为一个示例产品:

完整的代码如下:

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

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

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

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

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

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

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

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

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

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

结论

GraphQL 是一个灵活的工具,它使我们可以快速地开发基于数据模型的 API,而不是它们的完整的实现。GraphQL 的 schema 和 resolver 确保了我们能够快速迭代和改变我们的 API 接口,而不用担心它们的完整性。

通过上述例子的亲身实践,相信对于初学者来说,可以在实践中更进一步的了解和学习 GraphQL 开发技术。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6776260d6d66e0f9aa0ab934

纠错
反馈