从最基础的开始学习 GraphQL

阅读时长 8 分钟读完

GraphQL 是一种用于构建 Web 应用程序的查询语言。它是由 Facebook 开发的,逐渐成为前端领域中的热门技术之一。在 GraphQL 中,客户端可以指定需要从服务器获取的数据,避免了 RESTful API 中所遇到的一些问题,例如过度获取、多次请求等,并使得前端开发变得更加高效和灵活。本文将带您从最基础的开始,详解 GraphQL 的各个方面。

安装 GraphQL

首先,您需要在项目中安装 GraphQL,可使用以下命令:

定义 schema

在 GraphQL 中,schema(模式)容许了客户端与服务端之间的通信。它定义了客户端可以请求的查询类型和返回的数据类型。下面是一个简单的 schema 定义示例:

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

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

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

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

这个 schema 声明了一个 Query 类型,其中有一个 hello 字段,类型为 String,客户端可以请求这个字段。

定义 resolver

resolver 定义的是客户端请求的查询方法,在上面的示例中,hello 已被定义为一个 String 类型,现在我们需要定义它的具体实现。例如:

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

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

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

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

这里的 root 对象是一个带有 hello 字段的对象,客户端发起 hello 类型的请求时,会自动调用 root 中对应的方法并将数据返回。

定义查询参数

GraphQL 允许客户端定义参数,类似于函数的参数,它们可以传递给服务器以限制所请求的数据。例如:

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

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

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

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

这个示例定义了一个 rollDice 方法,它接受两个参数:一个必须的 numDice 参数,表示摇骰子的次数,还有一个可选的 numSides 参数,表示每个骰子的面数。客户端可以调用 rollDice 方法并指定这些参数的值,服务器会根据这些参数生成随机数,供客户端使用。

数据类型

除了 String 和 Int 之外,GraphQL 还定义了许多其他数据类型,例如 list 类型(即数组)和 object 类型。这里有一个例子:

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

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

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

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

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

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

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

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

在这个示例中,我们定义了一个 RandomDie 类型,有三个字段:numSides 表示骰子的面数、rollOnce 表示摇一次骰子的结果、roll 表示摇多次骰子的结果。在 Query 类型中,我们添加了一个可以获取 RandomDie 对象的方法:getDie。客户端可以指定一个 numSides 参数来控制骰子的面数。因为 roll 是一个 list 类型,所以我们通过传递一个包含 numRolls 参数的对象来定义请求多次 roll 的情况。

查询嵌套 resolver

在 GraphQL 中,我们可以使用查询嵌套 resolver 来更方便地获取数据库中的相关数据。例如:

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

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

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

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

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

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

在这个示例中,我们为 Query 类型添加了一个 getUser 方法,它接受 id 参数并返回一个 User 类型的对象,包含一个名为 friends 的数组类型,元素也是一个 User 类型的对象。在 resolver 中,我们映射用户对象中的 friends 属性为实际的用户对象。在客户端发起请求时,我们查询 getUser 方法,并选择要显示的字段,以及 friends 数组中的特定属性。

总结

在本文中,我们探讨了 GraphQL 的基础知识,包括如何安装、用 schema 和 resolver 定义查询类型和返回类型、定义查询参数、数据类型、查询嵌套等。通过掌握这些核心概念,您可以更好地使用 GraphQL 在前端开发中实现高效、灵活的数据获取方案。

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

纠错
反馈