GraphQL利器

2018-12-27  本文已影响0人  wish_dd

前言

在过去的十多年中,REST已经成为设计web api的一个模糊标准。它提供了一套比较完整语义化结构化的标准,然后这种设计还是相对而已比较僵硬,不够灵活,不能快速的对API进行扩容,无法跟上目前客户的快速需求变化。然而Facebook提供了一套比较完整的API接口设计GraphQL,GraphQL解决了REST对于开发人员的一些不便,大大提供了开发效率,以及扩展性。

官方定义:

GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. GraphQL provides a complete and understandable description of the data in your API, gives clients the power to ask for exactly what they need and nothing more, makes it easier to evolve APIs over time, and enables powerful developer tools.

什么是GraphQl

GraphQL全称Graph Query Language ,语义上指图表化查询语言,是一种描叙客户端香服务器请求数据的API语法,类似于RESTful API规范,它与数据库没有任何关系,
它不依赖任何数据库,可以与任何的MySQL、NoSQL数据库一起使用。

GraphQl的特征

query {
  users(): [User!]!
  user(id: Int): User!
}

mutation {
  createUser(): User!
  deleteUser(id: Int): User!
}

User是一个GraphQL对象类型,可以理解就是一个object对象,里面有一些字段属性, id、mobile、nickName、avatar就是scalar type,
createTime、updateTime是自定义的scalar type,workList就是一个object type
在每一次操作User查询时,只会出现定义的字段如id、mobile等等,
id: ID!表示这个字段是非空,也就是GraphQL服务一定能保证这个字段有值。[Work] 表示一个work对象的数组对象。

上述中的schema(query、mutation)是用来操作数据,type是数据类型,而resolve就是说明如何执行相关的(query、mutation)操作放回数据的逻辑,
也是连接schema与type的
GraphQL中,默认有这样的约定,Query(包括query、mutation、subscription)和与之对应的Resolve是同名的,比如关于users(): [User!]!这个query,它的Resolve的名字必然叫做user

如:前端调用query语句时:

query{

   users{
       id
       mobile
       workList{
        id
       }
   }
}

它的解析过程:

概括总结GraphQL大体解析流程就是遇见一个Query之后,尝试使用它的Resolver取值,
之后再对返回值进行解析,这个过程是递归的,直到所有解析Field类型是Scalar Type(标量类型)为止。
整个解析过程可以想象为一个很长的Resolver Chain(解析链)。

为什么使用GraphQL

概括总结:
客户端的对数据的述求:调用哪个方法,传递什么样的参数,返回哪些字段。服务端拿到这段 Schema 之后,
通过事先定义好的服务端 Schema 接收请求参数并执行对应的 resolve 函数提供数据服务。
整个过程可以想象成我们吃自助餐的过程,服务端 Schema 就好比自助餐线,
摆上我们能提供的所有食物;客户端 Schema 就描述了我们想要吃的食物,按需获取就好了

GraphQL 潜在问题

```
  works = Works.getAll();  
  works.forEach(item=>{
     label = Label.get(item.id)
  })
```

由于作品标签不存在work表中,所有第一次查询出作品列表,第二步循环去查询每个作品的标签信息,原本是一个查询的,结果
导致来N+1次,这就是N+1问题,在graphql中,很容易造成这样,主要是由于 GraphQL query 的逐层递归解析方式所引起的。
node解决方案采用DataLoader

小结

GraphQL只是一个API技术,它为API连接的前后端提供了一种新的便捷处理方案,与语言无关。无论如何,该做鉴权的就鉴权,该校验数据的还是一定得校验。
GraphQL会提供我们的开发效率,减少前后端的沟通成本,提高了程序的可扩展以及维护性。

上一篇 下一篇

猜你喜欢

热点阅读