初识RSET

先来点官方介绍,REST全称是Representational State Transfer,中文意思是表述性状态转移,指的是一组架构约束条件和原则,REST架构风格并非绑定在HTTP上,只不过目前HTTP是惟一与REST相关的实例,而符合REST风格的架构,就能够被成为RESTful.html

恩,很正式,但是对于理解其真正的含义帮助不大,下面咱们来看看如何经过HTTP实现REST.api

有个好东西,流行了十几年,忽然有一天,这东西的创造者跑出来讲,大家怎么瞎玩,这东西哪里是这么用的,因而:世界崩塌了~~~服务器

HTTP是互联网使用最多的协议,但是他的创始人说,绝大多数使用者都误解了HTTP的设计初衷,都在错误的使用HTTP.为何这么说呢,看下面的API格式对比restful

接口描述 传统API---[错误用法] RESTful API---[正确用法]
新增用户

http://127.0.0.1/user/save POST架构

http://127.0.0.1/user  POST 异步

删除用户

http://127.0.0.1/user/delete GET/POST spa

http://127.0.0.1/user  DELETE .net

修改用户信息

http://127.0.0.1/user/update POST设计

http://127.0.0.1/user  PUT 3d

根据ID获取用户信息

http://127.0.0.1/user/query/1 GET  

http://127.0.0.1/user/1 GET  

经过上面的对比,咱们很容易发现如下问题:

1.URL的不一样

URL的定义是统一资源定位符,从名字就能看出,URL的关注点是资源,因此它不该该包含动词,在对比表中咱们能够看见,传统API的URL中包含了操做用户的行为(上例中的描述已经算是规整了,由于接口相对简单,现实中每每存在着杂乱不堪的URL),而RESTful API则没有,只是使用user来表述这是用户信息资源

2.HTTP动词使用

传统API中,咱们只用到了GET和POST,但是HTTP动词可不止两个,大家觉得另外几个是干吗用的?因此,正确使用HTTP动词来描述API针对于资源所要进行的行为,比较常见的是POST,DELETE,PUT,GET

 

上述表格右侧已经给出了基本的RESTful API示例,下面咱们来更加全面的了解REST设计细节:

 

关于API版本号:

能够放在URL中或者HTTP头信息中,我的倾向前者,更直观易懂

https://api.example.com/v1/

 

资源定位符:

URL中不能出现动词,只能出现名词,名词建议采用复数形式

https://api.example.com/v1/users

 

HTTP动词:

使用HTTP动词来表示资源操做意图

  • POST(CREATE):在服务器新建一个资源。
  • DELETE(DELETE):从服务器删除资源。 
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
  • GET(SELECT):从服务器取出资源(一项或多项)。
  • -----------------------使用频度---------------------------
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
  • HEAD:获取资源的元数据。
  • OPTIONS:获取信息,关于资源的哪些属性是客户端能够改变的。

 

HTTP常见状态码:

使用HTTP状态码来反馈接口错误信息,不使用自定义返回信息(暂时没能说服我,HTTP状态码没法表达业务错误信息)

  • 200 OK - [GET]:服务器成功返回用户请求的数据,该操做是幂等的(Idempotent)。
  • 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
  • 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
  • 204 NO CONTENT - [DELETE]:用户删除数据成功。
  • 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操做,该操做是幂等的。
  • 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
  • 403 Forbidden - [*] 表示用户获得受权(与401错误相对),可是访问是被禁止的。
  • 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操做,该操做是幂等的。
  • 406 Not Acceptable - [GET]:用户请求的格式不可得(好比用户请求JSON格式,可是只有XML格式)。
  • 410 Gone -[GET]:用户请求的资源被永久删除,且不会再获得的。
  • 422 Unprocesable entity - [POST/PUT/PATCH] 当建立一个对象时,发生一个验证错误。
  • 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将没法判断发出的请求是否成功。

 

REST分级:

Level0:能够简单的理解成传统HTTP API

Level1:和Level0的区别是它的关注点换成了资源

Level2:本真RESTful,绝大多数的RESTful就是作到这一层,URL来表示资源,动词来表示行为

Level3:完美RESTful,又叫HATEOAS,核心思想就是资源有本身的状态,在不一样的状态下能执行的操做是不同的,即会在响应中加入相关的连接来引导客户端用户,而不须要查看文档

 

总结:REST是一种规则约束,是一种风格,是一种思想,但不是一种规范,固然也就不存在彻底的RESTful,理解REST,能帮助咱们更合理,更正确的使用HTTP规范,而非像以往那样只是用于传输.

 

参考资料地址:

http://www.ruanyifeng.com/blog/2014/05/restful_api.html

https://blog.csdn.net/qq_21383435/article/details/80032375

https://zhuanlan.zhihu.com/p/30396391?group_id=937244108725641216

https://blog.csdn.net/chenxiaochan/article/details/73716617

相关文章
相关标签/搜索