通俗易懂的 GraphQL 工作原理和实现

阅读时长 10 分钟读完

GraphQL 是一种用于构建 API 的查询语言,它使用了一种类似于 JSON 的格式来描述数据,并提供了一种强大而灵活的方式来获取所需的数据。相较于传统的 REST API,GraphQL 相对简便、易用,并且具备更强的可扩展性和数据抽象能力。

本文将介绍 GraphQL 的原理和实现,帮助读者更好地理解和应用该技术。

GraphQL 工作原理

GraphQL 将请求和响应的数据模型统一成了一个名为“图”(graph)的数据结构,在该结构中,每个数据类型定义了它们之间的关系和属性。在 GraphQL 的查询中,请求的数据结构可以跨越多个资源,并合并成一个可渲染的结果。

Schema 定义

在 GraphQL 中,Schema 用于描述数据结构和数据类型的定义。它包含了类型、属性和查询的定义。每个 Schema 都包含了 Query、Mutation 和 Subscription 三个 Type,分别代表查询、变更和订阅。

因此,通过 Schema,GraphQL 知道每个字段的名字、数据类型和返回结果。Schema 也可以帮助定义被支持的查询类型和变更,而且支持自定义 Scalar 类型。

下面是一个简单的 Schema 定义:

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

---- ----- -
  ------ ------
  ----------- ----- ----
-
展开代码

该 Schema 定义了两个 Type: User 和 Query。 User Type 定义了三个字段,包括 id、name 和 email。 Query Type 定义了两个查询,分别是获取所有用户信息和根据指定 ID 获取用户信息。

查询

GraphQL 查询用于获取数据。它类似于函数调用,但是只传递查询类型作为参数,而不是直接进行函数调用。查询参数也可包含变量,这些变量提供了一种动态的输入机制,在查询过程中可以将参数引入到查询变量中。

下面是一个简单的查询示例:

该查询用于获取所有用户的名字,并通过请求返回数据。

变更

GraphQL 变更用于修改数据。它通常被用于执行插入、更新和删除的操作。变更操作遵循标准的 Mutation Type 定义,Mutation Type 包含了所有可定义的变更操作。

下面是一个简单的添加用户信息的变更操作:

该变更操作用于添加一个新的用户信息,并通过请求返回添加的用户信息。

订阅

GraphQL 订阅用于实现实时应用程序,支持接收实时数据更新。订阅操作定义了一组事件,当这些事件发生时,将会触发 GraphQL 服务的启动并返回所请求的数据。

下面是一个简单的订阅示例:

该订阅用于获取用户的最新通知,当用户有新消息到达时,将会返回相应的信息。

GraphQL 实现

在实现 GraphQL 时,有多种工具和库可以作为支持,例如 Apollo Server、Express、GraphQL Yoga 等。下面基于 Express 框架介绍如何实现 GraphQL 服务。

安装

首先需要安装 Express 和 GraphQL 的各种依赖库:

创建服务器

创建一个 Express 服务实例,并在其上面创建 GraphQL API:

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

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

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

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

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

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

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

----------------
展开代码

上述代码中,首先定义了 GraphQL 的 Schema 和 Resolver,然后使用 express-graphql 中间件来在 Express 服务上设置 GraphQL 路由,即将 /graphql 路由请求交由 express-graphql 中间件进行处理。

启动服务后,可以通过访问 http://localhost:3000/graphql,进入 GraphiQL 页面,并且可以测试 API 调用。

测试查询

在 GraphiQL 页面进行如下查询操作:

点击运行按钮,即可得到返回的用户信息。

测试变更

在 GraphiQL 页面进行如下变更操作:

点击运行按钮,即可得到返回的添加的用户信息。

测试订阅

GraphQL 订阅需要使用 WebSockets 协议,所以需要使用 apollo-server-express 等第三方库来实现订阅功能,下面是一个简单的订阅示例:

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

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

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

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

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

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

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

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

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

----- ------ - --- --------
---------------------------- -- -
  -------------- -- -
    ------------------------------------------------ - ----------------- ------ --
  -- -----
--
展开代码

上述代码中,首先定义了 Schema 和订阅 Resolver。随后使用 apollo-server-express 库来实现 GraphQL API,并使用 subscriptions-transport-ws 库来将 Subscription Server 添加到 HTTP Server。

在测试订阅时,可以使用 ApolloClient 类库进行 WebSocket 的订阅调用:

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

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

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

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

------
  ------------ ----- --
  ------------
    ---------- -
      -----------------
    -
  --
展开代码

上述代码中,首先创建了 WebSocketLink,连接到 GraphQL 服务的 ws://localhost:3000/graphql 路径,然后通过 ApolloClient 订阅 query。

结语

本文介绍了 GraphQL 的原理和实现方法,希望读者在阅读后对 GraphQL 有更深入的了解,并且可以使用 GraphQL 来构建自己的 API 应用程序。

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

纠错
反馈

纠错反馈