o3o3o

点滴记录

0%

GraphQL 使用笔记

简述

简单的说, 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 一个页面的请求,取回所有需要的数据,减少网络开销

基础知识:

e.g:
demo
用GraphiQL访问: https://api.graph.cool/simple/v1/cixos23120m0n0173veiiwrjr

1
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
33
query 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

GraphQL Proxy

GraphQL代理, 对于client端,只暴露一个接口, 后端多个结点,结点间可以互相访问。例子

用scheme生成图的工具:

安全:

数据的安全问题: 使用GraphQL需要注意, 上线系统,关闭 __schema的查询,避免 pentester 轻易拿到结构数据
issue

性能

  • 性能问题: 因为python中使用graphQL, 运行时需要处理性能问题。python构造字典时所性能会拖慢,可以在类里面考虑添加__slots__

TODO:

  • GraphQL relationships node connection
  • django-graphql中如何在多层resolve 缓存?