简述
简单的说, GraphQL是API界的SQL查询语言。
Restful API的痛点
API 是后端与前端同学 必定要打交道的东西。 而对于API的设计,由于后端与前端人员的思维限制(非全栈),导致无论前端还是后端设计API, 很难让另一端满意, 需要多次交涉。
以下是一个常见的现象:
在一个页面的操作,包含多个功能, 而且UI界面与功能在频繁的修改。1
2后端UB: API应该是根据模块划分的,一个功能一个API
前端UC: 一个页面应该一个请求, 不然请求效率太低...
这时,有的人要说了,可以弄一个API gateway, 聚合的所有的API,可做这些可是苦力活。
这样的情况,我们也经历了一段时间,后期我们引入了GrapqhQL, 降低了不少成本。
GraphQL的特点:
- UI 变化频繁,server API 改动变少, Client根据自己的需求,组织语句去查询
- 自带文档,代码就是文档
- 强类型,不再需要或者 需要更少的 参数检查逻辑代码
- Server 与 Client 解藕
- server端开发,面向object数据,而不是页面。
- Client 一个页面的请求,取回所有需要的数据,减少网络开销
基础知识:
- 推荐先看 how to graphql
- 英文资料 or graphql入门中文
- django graphql
e.g:
用GraphiQL访问: https://api.graph.cool/simple/v1/cixos23120m0n0173veiiwrjr1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33query queryTest{
allUsers(orderBy:id_DESC, first:2 ){
## Fragment example
...UserField
}
# alias example
Movies: allMovies(first:1){
actors(first:2){
name
}
}
# node usage
node(id:"cj21vcky017ot0112ohc1bid8"){
id
... on User{
name
}
}
}
#Fragment: UserField with spefied field
fragment UserField on User{
id
name
createdAt
}
mutation createUser{
createUser(name:"testUser") {
id
}
}
IDE工具:
目前几个工具用的最多的还是GraphiQL
- insomnia 没有postman好用, 可惜postman目前还支持不了..
- GraphiQL
- graphql-playground
mac可以直接执行安装:brew cask install graphql-playground
GraphQL Proxy
GraphQL代理, 对于client端,只暴露一个接口, 后端多个结点,结点间可以互相访问。例子
- 把remote endpoints merge在一起Graphql merge the subschema
- 多个subschema之间嵌套查询
- How do grapnel remote schemes work
用scheme生成图的工具:
安全:
数据的安全问题: 使用GraphQL需要注意, 上线系统,关闭 __schema
的查询,避免 pentester 轻易拿到结构数据
issue
性能
- 性能问题: 因为python中使用graphQL, 运行时需要处理性能问题。python构造字典时所性能会拖慢,可以在类里面考虑添加
__slots__
Other Links:
TODO:
- GraphQL relationships node connection
- django-graphql中如何在多层resolve 缓存?