为什么推荐 GraphQL 而不是 RESTful API

RESTful API不足

  1. 前端和后端对于接口的控制权是交叉冲突的,往往一方改动不算,前端改动一个字段,连带着后端也需要改动,反之亦是
  2. 前端对于真正用到的字段是没有直观映像的,仅仅通过url地址,无法预测也无法回忆返回的字段数目和字段是否有效,接口返回50个字段,但却只用5个字段,造成字段冗余,扩展性差,单个RESTful接口返回数据越来越臃肿
  3. API聚合问题,某个前端展现,实际需要调用多个独立的RESTful API才能获取到足够的数据
  4. 前后端字段频繁改动,导致类型不一致,错误的数据类型可能会导致网站出错
  5. 尤其是在业务多变的场景中,很难在保证工程质量的同时快速满足业务需求

案例1:比如获取用户信息/users/:id,最初可能只有id、昵称,但随着需求的变化,用户所包含的字段可能会越来越多,年龄、性别、头像、经验、等级,等等等等。而具体到某个前端页面,可能只需要其中一小部分数据,这样就会增加网络传输量,前端获取了大量不必要的数据。

案例2:比如一个文章详情页,最初可能只需要文章内容,那么前端就调用/articles/:aid获取到文章内容来展现就行了

但随着需求的演进,产品可能会希望加上作者信息(昵称、头像等),这时前端又需要在获取文章详情后,根据其中的作者id字段继续获取作者相关的信息,/user/:uid

然后,需求又变化了,产品希望在加上这篇文章的评论,这时前端需要继续调用/comment/:aid来拉取评论列表

对于Web前端而言,由于ajax技术的存在,这种的请求数据方式,也就开发上稍微麻烦些,并不会造成太大的问题;但对于App来说,渲染的方式不同,必须要拉取的全部的数据之后,才能绘制界面,就会导致这个界面必须要等到所有3个RESTful接口的返回数据都拿到,才能进行绘制。

关于RESTful可参考以下文章:

GraphQL优点

  1. GraphQL是Facebook开源的API查询语言,类似于数据库中的SQL。作为比较,RESTful API依赖于后端隐式的被动的数据约定,GraphQL更加显式,在获取数据和更新数据时更加主动,所见即所得。
  2. 从调用者的角度看,GraphQL更加依赖于前端,相当于是把后端的部分SQL能力转移到了前端。GraphQL可以通过查询规则,而不是通过特定的url地址来对后端的数据源进行调用,并且可以选择需要用到的字段,后端也只返回这些字段。相当于数据库SQL,但是SQL的查询对象只能是数据库,而GraphQL的查询对象是数据源,这个数据源可以是HTTP接口、数据库查询集合、静态json文件、另外一个api的数据源,特别的灵活。
  3. GraphQL更强大的一点是可以实现对多个数据源的调用,合并成一份完整的数据给前端使用

策略1:所见即所得

查询的返回结果就是输入的查询结构的精确映射

// 查询
{
    user(uid:1) {
        uid
        name
    }
}
// 结果
{
  "data": {
    "user": {
      "uid": "1",
      "name": "xxx"
    }
  }
}

策略2:减少网络请求次数

如果设计的数据结构是从属的(例如,上文中文章的作者信息),直接就能在查询语句中指定

{
    article(aid:1) {
        title
        content
        author {
            uid
            name
        }
    }
}

即使数据结构是独立的,也可以在查询语句中指定上下文,只需要一次网络请求,就能获得资源和子资源的数据(例如,上文中文章的评论信息) 

{
    article(aid:1) {
        title
        content
        author {
            uid
            name
        }
    },
    comment {
        content,
        author {
            uid
            name
        }
    }
}

策略3:代码即文档

GraphQL会把schema定义和相关的注释生成可视化的文档,从而使得代码的变更,直接就反映到最新的文档上,避免RESTful中手工维护可能会造成代码、文档不一致的问题。

策略4:参数类型强校验

RESTful方案本身没有对参数的类型做规定,往往都需要自行实现参数的校验机制,以确保安全。

但GraphQL提供了强类型的schema机制,从而天然确保了参数类型的合法性。

总结

从Facebook最初开发GraphQL的目的,和笔者实际使用的情况而言,GraphQL还是存在一些缺点的,完全替代RESTful作为一种新的接口规范还有些为时过早.

GraphQL作为RESTful的一种辅助工具,尤其是针对前端App在复杂页面,本来要调用有上下文关系的多次RESTful请求时,采用GraphQL,只需要一次请求,就可以拿回所需的全部数据(有点JSON直出的意思),还是可以起到非常好的效果,大大提升App的性能。

参考文档

GraphQL和RESTful的比较

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值