在传统的 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 查询由以下几个部分组成:
- 查询字段
- 参数
- 返回值
例如,对于一个简单的查询:
query {
book(id: 123) {
title
author {
name
}
}
}这个查询涉及到 book 和 author 列表的数据,这些数据通过 GraphQL API 的查询操作返回。
实现基于 GraphQL 的数据地图
现在让我们来看一下如何实现基于 GraphQL 的数据地图。首先,我们需要对数据进行建模。
假设我们的数据是这样看待的:
- 国家
- 州
- 区域
- 县
我们可以利用 GraphQL 的 schema 来定义这些数据,这是我们的基础 schema:
-- -------------------- ---- ------- ---- ------- - --- --- ----- ------- ------- --------- - ---- ----- - --- --- ----- ------- -------- ---------- - ---- ------ - --- --- ----- ------- --------- ---------- - ---- ------ - --- --- ----- ------- ----------- ---- -
要查询一个国家的数据,我们可以这样编写查询:
-- -------------------- ---- -------
----- -
--------- -
--
----
------ -
--
----
------- -
--
----
-
-
-
-这个查询操作将会返回我们定义的国家 schema,包括国家 ID、名称、州的 ID 和名称、区域的 ID 和名称。
接下来,我们定义一些 resolver 来处理这些数据,例如一个查询国家数据的 resolver:
-- -------------------- ---- -------
----- --------- - -
------ -
---------- -------- ----- -------- ----- -- -
-- -- --------- --------------
------ -----------------------
--
--
-------- -
------- -------- ----- -------- ----- -- -
------ -------------------
------ - ---------- --------- --
---
--
--
------ -
-------- -------- ----- -------- ----- -- -
------ --------------------
------ - -------- --------- --
---
--
--
------- -
--------- -------- ----- -------- ----- -- -
------ ---------------------
------ - --------- --------- --
---
--
--
-这段代码定义了数据库db中的查询和数据提取操作,其中 states 查询了某个国家下所有的州,regions 查询了某个州下所有的区域,counties 查询了某个区域下所有的县。
最后的步骤是将 these 基础信息添加到我们的常规 GraphQLServer 中,我们将使用 apollo-server 作为一个示例产品:
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => {
console.log(`Server running at ${url}`);
});完整的代码如下:
-- -------------------- ---- -------
----- - ------------- --- - - -------------------------
----- -------- - ----
---- ------- -
--- ---
----- -------
------- ---------
-
---- ----- -
--- ---
----- -------
-------- ----------
-
---- ------ -
--- ---
----- -------
--------- ----------
-
---- ------ -
--- ---
----- -------
----------- ----
-
---- ----- -
---------- -----------
-
--
----- -- - -
---------- -
- --- ---- ----- ----- --
- --- ---- ----- ---- --
- --- ---- ----- ------- --
--
------- -
- --- ---- ----- ------------- ---------- --- --
- --- ---- ----- -------- ---------- --- --
- --- ---- ----- --------- ---------- --- --
- --- ---- ----- ------------- ---------- --- --
- --- ---- ----- --------- ---------- --- --
- --- ---- ----- ------ ---------- --- --
--
-------- -
- --- ---- ----- ---- --------- -------- --- --
- --- ---- ----- ---- ----------- -------- --- --
- --- ---- ----- --------- -------- --- --
- --- ---- ----- ---------- -------- --- --
- --- ---- ----- -------- -------- -------- --- --
- --- ---- ----- -------- -------- -------- --- --
- --- ---- ----- ----- -------- -------- --- --
--
--------- -
- --- ---- ----- ----- --------- ---- ----------- ------ --
- --- ---- ----- ------------ --------- ---- ----------- ------ --
- --- ---- ----- ------- -------- --------- ---- ----------- ----- --
- --- ---- ----- ------- -------- --------- ---- ----------- ----- --
--
--
----- --------- - -
------ -
---------- -------- ----- -------- ----- -- -
------ -------------
--
--
-------- -
------- -------- ----- -------- ----- -- -
------ ------------------------ -- --------------- -- -----------
--
--
------ -
-------- -------- ----- -------- ----- -- -
------ -------------------------- -- -------------- -- -----------
--
--
------- -
--------- -------- ----- -------- ----- -- -
------ --------------------------- -- --------------- -- -----------
--
--
--
----- ------ - --- -------------- --------- --------- ---
----------------------- --- -- -- -
------------------- ------- -- ---------
---结论
GraphQL 是一个灵活的工具,它使我们可以快速地开发基于数据模型的 API,而不是它们的完整的实现。GraphQL 的 schema 和 resolver 确保了我们能够快速迭代和改变我们的 API 接口,而不用担心它们的完整性。
通过上述例子的亲身实践,相信对于初学者来说,可以在实践中更进一步的了解和学习 GraphQL 开发技术。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/6776260d6d66e0f9aa0ab934