Graphql 学习与REST比较

2018-05-09  本文已影响0人  molscar

学习链接:

一、graphql 初体验

官方定义:

A query language for your API (API 查询语言)

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 如下:

如果请求如下(真实开发可能有点差别):

query{ 
    comment(id: "1") { 
          title 
          user { 
               nickname
               email
          } 
    }
}

后台一部分的类型定义如下:

type Comment {
  id: ID
  user: User!
  post: Post!
  title: String
  body: String!
}

那么将可能会返回:

{
  "title": "hello world",
  "user": {
    "nickname": "molscar",
    "email": "example@gmail.com",
  }
}

而如果使用REST 来发请求的话,会是这样:

GET /comment/1

二、graphql 和 REST的比较

RESTful 大概是这样:

[图片上传失败...(image-2aa3e3-1525878216847)]

那么 graphql 大概就是这样:

[图片上传失败...(image-d1e17f-1525878216847)]

再给一个例子感受一下:

需求:有关电影和其出演人员的信息

RESTful的一些不足:

GraphQL的一些优点:

路由处理器(Route Handlers)和 解析器(Resolvers)

Route Handlers:

  1. 服务器收到HTTP请求,提取出HTTP方法名与URL路径
  2. API框架找到提前注册好的、请求路径与请求方法都匹配的代码
  3. 该段代码被执行,并得到相应结果
  4. API框架对数据进行序列化,添加上适当的状态码与响应头后,返回给客户端

Resolvers:

  1. 服务器收到HTTP请求,提取其中的GraphQL查询
  2. 遍历查询语句,调用里面每个字段所对应的Resolver。
  3. Resolver函数被执行并返回相应结果
  4. GraphQL框架把结果根据查询语句的要求进行组装(匹配)

三、个人感受

GraphQL使用解析器来构建API,让返回的数据不会那么臃肿,而且也非常酷啊,可以自动解析需要返回的数据,以及校验类型,graphql还有很多东西,这里就不涉及了,我也不是很了解,不过graphql和REST还是有很多相通的地方。

虽然GraphQL确实有很多优点,但是个人感觉不是很好构建一个完整的API,尤其是特别复杂的项目的时候,而且现在graphql没啥轮子,最近用golang玩一玩graphql的时候,想加个装饰器都不好加,graphql没有暴露很多接口,封装很紧,而且因为graphql自己有一套语法,如果想自己解析的话,得自己写一套解析器,找了半天都没找打怎么获取request的header部分的内容等。。。想给graphql加一层装饰器,然后传一个参数给下一层都不好传。。。肯定是自己太菜了

个人实战示例:https://github.com/tofar/golang-graphql-example

上一篇 下一篇

猜你喜欢

热点阅读