对于前后端分离的项目,后端通常把数据接口定义成RESTful API或者GraphQL,可以把RESTful和GraphQL理解成是浏览器与服务器通信方式的一种设计风格,那么两者有什么不同呢?
一,RESTful API:
RESTful API常见的请求方式有 get:查询数据;post:添加数据;put:更新数据;delete:删除数据
不足:
- 扩展性不足
一个接口有可能因为需求变更而变的越来越臃肿,比如获得用户信息的接口/user/userid,刚开始可能只有用户id、用户名称,但是随着需求的变更可能还会有用户年龄,职业,地址等等信息,而一个前端页面可能只需要其中一部分信息,这无疑增加了网络传输量,前端获得很多不必要的信息。
- 数据聚合问题
一个前端页面如果即需要展示用户信息,又需要展示用户评论信息,这时后端就要先查询用户信息,再查询用户评论信息,最后合并到一起返回给前端,而对于后端来说查询的接口越多意味着耗时越长。
对于RESTful API存在的问题,使用GraphQL可以有效避免。
二,GraphQL:
GraphQL是Facebook开源的API查询语言。
优点:
- 所见即所得
查询的结果就是输入查询结构的精准映射
查询:
{
user(uid:1) {
uid
name
}
}
返回:
{
"data": {
"user": {
"uid": "1",
"name": "xxx"
}
}
}
- 没有数据聚合问题
如果查询的数据结构是有从属的,可以一次返回
{
article(aid:1) {
title
content
author {
uid
name
}
}
}
即使查询的数据结构直接可能没有从属,也可以一次返回
{
article(aid:1) {
title
content
author {
uid
name
}
},
comment {
content,
author {
uid
name
}
}
}
- 代码即文档
GraphQL会把schema定义和相关的注释生成可视化的文档,从而使得代码的变更,直接就反映到最新的文档上,避免RESTful中手工维护可能会造成代码、文档不一致的问题。
- 参数类型强校验
RESTful方案本身没有对参数的类型做规定,往往都需要自行实现参数的校验机制,以确保安全。
但GraphQL提供了强类型的schema机制,从而天然确保了参数类型的合法性。