概念
REST(Representation State Transfer),译为表现层状态转移,太抽象了,这啥呢?其实RESTful是一种接口的设计风格,它主要用于面向资源编程,面向资源又是啥呢?
带着一系列疑问,去网上查阅了大量的资料,以下是自己的一些理解:
理解
面向资源编程 的资源指的是客户端在请求服务器的资源,此时我们应该明白,客户端在请求服务器的资源使用的是URL或URI。从这个层面出发,我们应该发现问题,传统的前端和后端代码之间的编写存在着千丝万缕的关系,例如前端中使用的URL路径直接与后端的web层交互,所以前端和后端的开发需要经常性沟通,才能确保设计出来的程序前后端可以正常交互。
但是这种手段无疑降低了开发的效率,还有可能出现问题后,出现前后端程序员互相帅锅的可能。所以现在的程序我们都推崇使用前后端分类的开发技术,RESTful设计风格孕育而生了。
RESTful是目前最流行的API设计规范了,用于web网络接口的设计。
请看下面这些传统URL的设计:
# http://apo.demo/createNewCar //创建新车
# http://apo.demo/deleteCars //删除新车
# http://apo.demo/updateCars //更新
# htpp://apo.demo/deleteRedCars //删除红车(更新部分)
# http://apo.demo/getAllCars //获取所有车
这些URL都是我们前端程序员干的活,当然后端程序员大概也看得懂这些请求都是干嘛的,但是它就一定能从后端的接口对接吗?显然不一定!!因为表单的请求方法并不清楚?
RESTful风格的URL设计:
# htpp://apo.demo/createNewCar //提供POST请求方法
# htpp://apo.demo/deleteCars //提供Delete请求方法
# htpp://apo.demo/updateCars //提供Put请求方法
# htpp://apo.demo/deleteRedCars //提供Patch请求方法
# htpp://apo.demo/getAllCars //提供Get请求方法
可见,此时前端的程序员又告诉后端程序员一些规范,只要后端程序员能遵从,便可以实现减少沟通,达到各自开发自己的业务的目的。
RESTful的核心思想就是客户端发出的请求是由客户端发出带有信息的URL+操作指令构成,
# htpp://apo.demo/deleteRedCars/1 //提供Patch请求方法
表示的是删除id = 1的红车,现在是不是很清晰了。
所以RESTful风格的接口设计,让我们以优雅的方式显示资源,资源使用URL指定,/deleteRedCars/1
就能表示一个URI,表示的是删除id = 1的红车。
看到这边可以把RESTful想成是一种建立在HTTP协议上的设计模式,充分利用了HTTP的特点,使用URI来表示资源,用不同的HTTP动词(Get,Post,Put,Delete方法)来表示对资源的各种行为,这样做的好处就是实现了资源和操作分离。
服务器接收到客户端的请求后,会处理,分析数据,然后进行响应,响应状态吗也是有讲究的:
1xxx:相关信息
2xxx:操作成功
200:表示操作成功
201:POST返回201,表示生成了新资源
202:服务器接收到请求未处理,会在未来处理
204:DELETE返回204,表示资源已经不存在了
3xxx:重定向
302:重定向
4xxx:客户端错误
402:用户未通过身份验证,或没有身份验证
403:用户通过身份验证,但是没有访问资源权限
404:用户请求的资源不存在
5xxx:服务端错误
500:客户端请求有效,但是服务端发生了意外
优势
- 可以实现前后端分离,面向资源编程
- 充分的利用了HTTP协议本身的语义
- 无状态,这点非常重要,在调用一个接口时(操作,访问资源),可以不用考虑上下文的情况,不用考虑当前状态,极大的降低的复杂度
劣势
- RESTful透明化了你的URI,产生了安全性的问题。
- 如果系统比较庞大,里面设计的业务比较复杂,RESTful的设计难度也会跟着提高。
小结
使用RESTful:
- 看URI就可以知道要什么
- 看http method就知道要干什么
- 看http status code就知道结果如何
预防API被人攻击可以启用API调用速率机制,或者时Http cache机制。
参考:
https://mp.weixin.qq.com/s/HYUv21PNqIljdAtAFx181A
https://github.com/twtrubiks/django-rest-framework-tutorial/tree/master/RESTful-API-Tutorial
个人灼见。如有出入,恳请指教🙏