GraphQl介绍


什么是GraphQL?

官网的介绍:一种用于API的查询语言。

通常说到API都是说调用,那查询API是什么操作呢?

大家都知道SQL,数据库的查询语言。其实gql和sql就有些相似。

比如sql是这样的语句:

gql也是个语句,它可以写成这样:

他们都是一种查询语言,用一定的语法来描述你想要的数据。

上面的gql会返回一个json:

这个查询语句就是GraphQL(gql)。

GraphQL能干嘛?

知道了它是什么,还得了解它是做什么事的。

举个例子:

首先,我们要做一个需求,是一个这样的页面,里面有若干数据。

这些数据由一个API接口返回:

后来需求变了,有些数据不需要显示了:

那么API接口也可能做对应的变化。

这次是减字段,也可能是加字段。还可能要考虑兼容旧版本(APP或灰度),不改原来的API,通过加API来做新需求。

这些修改不仅消耗时间和精力。长时间的积累,也会在前后端,出现很多冗余的字段,冗余的API。给项目积累了一些混乱和风险。

这时候GraphQL就能派上用场了。看下面的视频。上半部分是gql语句,下半部分是查询到的结果。

我们看到,对于hero对象,gql可以只查询一个name字段,也可以查询3个字段。

如果用gql来查询API接口,是不是就能避免上面提到的“冗余的字段,冗余的API。混乱和风险。”

这里大致介绍了GraphQL能做的事。

实现

知道了GraphQL是什么和能做什么事,接下来该介绍怎么实现这个技术方案了。

我们知道sql查询的是数据库,我们运行一个sql语句需要在数据库服务器的环境。同样的运行一个gql也需要一个gql的服务器。

实现gql服务器前,需要先了解ji个gql的概念:schema和类型。

gql的类型

GraphQl是通过类型系统来定义数据和行为。这些类型就需要通过schema语句定义的。先看一段schema语句:

使用type声明一个类型,图中有3个类型,其中QueryMutation是原始类型,分别表示查询变更,这两个类型内部就是定义查询和变更的行为。

Book类型是我们的数据类型,是自定义类型。

schema只是定义了数据类型和行为类型。有了类型,我们还需要根据类型执行不同的任务。执行这些任务的角色就叫解析器。

Resolver解析器

解析器是行为类型的实现,它需要与数据库对接,来查询数据库。比如上面定义的Query和Mutation类型的实现:

这个解析器是通过MongoDB实现的:

所以具体的getAll和getById实际上都是执行的mongoDB的查询。

服务器上主要做这两件事,通过schema定义类型,和实现具体的解析器。

server的代码在这里https://gitee.com/wss1942/appllo-serve.git

这个server的实现用到了mongoDB数据库,需要自己安装,我是按照菜鸟的教程做的,很简单。

客户端(网页)

代码在这里https://gitee.com/wss1942/apollo-client.git

实现一个gql的客户端主要需要2部分,网络层和存储层。

用了client就可以执行gql语句进行查询了:

还有变更:

updatedupdated2020-10-122020-10-12