learning_graphQL_笔记1

1.基本概念介绍

SQL四大操作:SELECT,INSERT,UPDATE,DELETE基本对应上如今REST中的read,create,update,delete,在REST的世界中,我想获取什么数据或者删除什么数据是通过HTTP动词+URL来表达的,而这就是REST的弊端之一,我想要的东西是模糊其词的被表达出来,多了一点抽象。

SQL是后端和数据库说话,客户要数据,但是却不是发声者。对于graphQL而言,它是客户端和后端说话,我想要什么都是可控的,graphQL会在网络中传输,而固定的SQL静静躺在服务端代码里。

由于SQL是数据库语言,所以SQL数据存储在数据表中;但是对于graphQL而言,数据可以是数据库(一个或多个不同的),文件系统等。

graphQL利用Query来替代SELECT;利用Mutation来替代UPDATE,INSERT,DELETE。客户端会将grapQL作为POST请求的data发送到后端的API里面。此外,graphQL还提供了Subscription。

2.graphQL语法基本介绍

想要体验graphQL的用法的话,那么可以在http://snowtooth.moonhighway.com/进行体验。已知allTrails,allLifts是我们已经定义好了的graphQL type之一。示例如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
query {
allTrails {
name
status
}
}

// 返回数据大致如下所示

{
"data": {
allTrails: [
{ name: '...', status: '...' },
{ name: '...', status: '...' }
]
}
}

同时,在查询的时候我们也可以设置别名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
query {
at: allTrails {
n: name
status
}
allLifts {
name
}
}

// 返回数据大致如下所示

{
"data": {
at: [
{ n: '...', status: '...' },
....
],
allLifts: [
{ name: '...' },
...
]
}
}

这里补充一下,如果graphQL查询结果报错的话,那么返回json数据中field就不是data了,而是error。

2-1.条件查询

1
2
3
4
5
6
query al {
allLifts(status: "CLOSED" sortBy: "name") {
name
status
}
}

2-2.fileds type

先解释一下哪些是field,在上面这个例子中,name就是一个field。field的类型要么是scalar type要么是object type,其中scalar type在graphQL中有五种,分别是Int,Float,String,ID,Boolean;其中Int和Float都对应JSON中的Number,String和ID都对应了JSON中的String,Boolean就是JSON中的Boolean。

2-3.fragment

可以使用fragment来简化graphQL代码。用法:fragment fragmentName on QueryTYPE {}。需要注意的是,默认一个fragment只能用在其所对应的fileds type上面。示例如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
fragment first on Lift {
name
status
night
}
query {
Lift(id: "jazz-cat") {
...first
trailAccess {
name
}
}
Trail(id: "river-run") {
name
status
night
accessedByLifts {
...first
}
}
}

尽管查询Trail的时候里面有些field的名字还是冗余了,但是正如前面所说,我们并不能将first这个fragment应用在Trail这个query type上面。所以我们得在定义一个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
fragment first on Lift {
name
status
night
}
fragment t on Trail {
name
status
night
accessedByLifts {
...first
}
}
query {
Lift(id: "jazz-cat") {
...first
trailAccess {
name
}
}
Trail(id: "river-run") {
...t
}
}

2-4.unit type

对于某个query type,我们希望它所查询出来的东西既可以是typeA,也可以是typeB,那么可以如下实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
query schedule {
agenda {
...on Workoout {
name
reps
}
...on StudyGroup {
name
subject
students
}
}
}

3.Mutation

正如前面所说,数据四大操作增删改查,在graphQL增删改都只被Mutation一个给抽象了。下面看一个mutation的例子:

1
2
3
4
5
6
7
mutation {
setLiftStatus(id: "jazz-cat", status: OPEN) {
name
id
status
}
}

其中setLiftStatus是mutation API,后面跟着的是参数,同时这个query操作所返回的结果也是以setLiftStatus作为键名的,返回的结果就是包含id,name,status这三个字段。