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 | query { |
同时,在查询的时候我们也可以设置别名:
1 | query { |
这里补充一下,如果graphQL查询结果报错的话,那么返回json数据中field就不是data了,而是error。
2-1.条件查询
1 | query al { |
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 | fragment first on Lift { |
尽管查询Trail的时候里面有些field的名字还是冗余了,但是正如前面所说,我们并不能将first这个fragment应用在Trail这个query type上面。所以我们得在定义一个:
1 | fragment first on Lift { |
2-4.unit type
对于某个query type,我们希望它所查询出来的东西既可以是typeA,也可以是typeB,那么可以如下实现:
1 | query schedule { |
3.Mutation
正如前面所说,数据四大操作增删改查,在graphQL增删改都只被Mutation一个给抽象了。下面看一个mutation的例子:
1 | mutation { |
其中setLiftStatus是mutation API,后面跟着的是参数,同时这个query操作所返回的结果也是以setLiftStatus作为键名的,返回的结果就是包含id,name,status这三个字段。