文章目录
  1. 1. 简述
  2. 2. Restful API的痛点
  3. 3. 基础知识:
  4. 4. GraphQL Proxy
  5. 5. 安全、性能:
  6. 6. Tips:
    1. 6.1. IDE工具:
    2. 6.2. 用scheme生成图的工具:
  7. 7. Other Links:
  8. 8. TODO:

简述

简单粗暴的来说: GraphQL是API界的SQL查询语言。(好吧,真的是简述…:p)

Restful API的痛点

在工作中后端与前端同学协作中必不可少要打交道的东西。 在API的设计时,无论后端还是前端人员主导API设计,由于其本身受到思维定式(仅限于非全栈同学), 很难设计出一个双方都比较满意的API。

这是个常见的现象:
在一个页面的操作,包含多个功能, 而且UI界面与功能在频繁的修改。

1
2
后端UB:  API应该是根据模块划分的,一个功能一个API
前端UC: 一个页面应该一个请求, 不然请求效率太低...

这时,有的人要说了,可以弄一个API gateway, 聚合的所有的API,可做这些可是苦力活。

在经历了这个过程后,后期我们引入了GrapqhQL, 终于解决沟通API而出现的问题。

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
}
}

GraphQL Proxy

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

安全、性能:

数据的安全问题: 使用GraphQL需要注意, 上线系统,关闭 __schema的查询,避免被脱库

性能:

  • 一次请求里面,调用多次同一对象的情况(N+1问题),可以使用DataLoader来缓存
  • 因为python中使用graphQL, 运行时需要处理性能问题。python构造字典时所性能会拖慢,可以在类里面考虑添加__slots__

Tips:

IDE工具:

目前几个工具用的最多的还是GraphiQL

用scheme生成图的工具:

TODO:

  • GraphQL relationships node connection
  • django-graphql中如何在多层resolve 缓存?
文章目录
  1. 1. 简述
  2. 2. Restful API的痛点
  3. 3. 基础知识:
  4. 4. GraphQL Proxy
  5. 5. 安全、性能:
  6. 6. Tips:
    1. 6.1. IDE工具:
    2. 6.2. 用scheme生成图的工具:
  7. 7. Other Links:
  8. 8. TODO: