如何使用 GraphQL 为前端应用提供数据

阅读时长 16 分钟读完

GraphQL 是一种用于 API 的查询语言和运行时环境,由 Facebook 开发并开源。它提供了一种更高效、强大和灵活的方式来获取和修改数据,可以大大提高前端应用的开发效率和用户体验。

在本文中,我们将介绍 GraphQL 的基本概念、语法和用法,并提供一些示例代码和实践经验,帮助读者快速掌握如何使用 GraphQL 为前端应用提供数据。

什么是 GraphQL

GraphQL 是一种用于 API 的查询语言和运行时环境,它允许客户端指定需要的数据,而不是像 RESTful API 那样将所有数据都返回给客户端。GraphQL 的核心思想是“只返回客户端请求的数据”,这样可以避免网络传输过多的数据,提高响应速度和带宽利用率。

GraphQL 的主要特点包括:

  • 客户端指定需要的数据,避免过度获取和传输数据
  • 支持多个数据源和数据类型,可以聚合多个 API 的数据
  • 可以定义和验证数据模型和查询规则,提高代码的可维护性和安全性
  • 支持实时数据更新和订阅,可以实现实时通信和推送功能

GraphQL 的基本语法

GraphQL 的语法类似于 JSON,但是具有更高级的查询和操作功能。GraphQL 的基本语法包括以下几个部分:

查询

查询是用来获取数据的语句,它可以包含多个字段和参数,用逗号分隔。查询语句的格式如下:

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

其中 query 是查询类型,fieldName 是需要查询的字段名,subFieldName 是需要查询的子字段名。查询可以嵌套,可以使用别名和变量来简化和优化查询语句。

变量

变量是用来传递参数的值,以 $ 开头,后面跟变量名和类型。变量的值可以在查询语句中使用,用 : 分隔。变量的格式如下:

其中 varName 是变量名,varType 是变量类型,argName 是参数名,$varName 是变量的值。

操作

操作是用来修改数据的语句,它包括创建、更新和删除等操作。操作语句的格式如下:

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

其中 mutation 是操作类型,operationName 是操作名,input 是操作的输入参数,fieldName 是需要查询的字段名。

如何使用 GraphQL

使用 GraphQL 可以分为以下几个步骤:

1. 定义数据模型

首先需要定义数据模型,包括数据类型、字段名、字段类型、关联关系等。可以使用 GraphQL 的类型系统来定义数据模型,例如:

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

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

其中 UserPost 是数据类型,idnameemailtitlecontent 是字段名,IDString 是字段类型,! 表示非空,[Post!]! 表示数组类型。

2. 定义 API

然后需要定义 API,包括查询和操作。可以使用 GraphQL 的语法来定义 API,例如:

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

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

其中 QueryMutation 是 API 类型,usersuserpostspostcreateUserupdateUserdeleteUsercreatePostupdatePostdeletePost 是 API 名称,后面跟参数和返回值类型。

3. 实现 API

然后需要实现 API,包括查询和操作。可以使用任何编程语言和框架来实现 API,只需要遵循 GraphQL 的规范和语法。例如,使用 Node.js + Express + GraphQL 来实现 API:

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

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

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

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

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

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

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

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

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

其中 buildSchema 是用来定义数据模型和 API 的函数,graphqlHTTP 是用来处理 HTTP 请求和响应的函数,schema 是数据模型和 API 的定义,root 是 API 的实现。

4. 调用 API

最后需要调用 API,可以使用任何客户端库和框架来调用 API,只需要遵循 GraphQL 的规范和语法。例如,使用 React + Apollo 来调用 API:

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

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

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

其中 ApolloClient 是用来创建客户端的函数,InMemoryCache 是用来缓存数据的类,gql 是用来定义查询语句的函数,query 是用来发送查询请求的方法。

示例代码

以下是一个完整的示例代码,演示如何使用 GraphQL 为前端应用提供数据。

1. 定义数据模型

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

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

2. 定义 API

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

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

3. 实现 API

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

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

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

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

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

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

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

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

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

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

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

4. 调用 API

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

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

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

总结

本文介绍了如何使用 GraphQL 为前端应用提供数据,包括定义数据模型、定义 API、实现 API 和调用 API 等步骤。GraphQL 的核心思想是“只返回客户端请求的数据”,它可以大大提高前端应用的开发效率和用户体验。GraphQL 的主要特点包括客户端指定需要的数据、支持多个数据源和数据类型、可以定义和验证数据模型和查询规则、支持实时数据更新和订阅等功能。GraphQL 可以使用任何编程语言和框架来实现 API,可以使用任何客户端库和框架来调用 API。GraphQL 是一种非常强大和灵活的技术,值得前端开发者深入学习和实践。

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

纠错
反馈