概念

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

个人灼见。如有出入,恳请指教🙏