RESTFUL
起源
REST概念由HTTP 1.1 负责人,罗伊·菲尔丁(Roy Fielding)提出。REST是“表征状态转移”(Representational State Transfer)的缩写。REST相较于HTTP,类似于接口和实现的关系。
表征
用户和信息交互时的表示形式。用户发送请求,是获取html还是获取pdf等。
状态
用户和信息交互时,产生的上下文信息。例如:用户翻页到了第几页。
转移
服务端通过某种形式,改变用户的状态。例如:用户获取到下一页的信息。
核心特征
服务端和客户端分离
将用户界面和服务存储逻辑分离开来,有助于提高用户界面的可移植性。
无状态
服务端不负责维护状态。客户端保存状态,发起请求时,携带状态。服务端根据客户端携带的状态进行业务处理。
可缓存
客户端和服务端之间的代理,将部分请求进行缓存,减少交互。
分层系统
客户端不需要知道请求最终到了哪台服务器,由中间服务器提供负载均衡。
统一接口
面向资源编程,具体的动作由HTTP提供。HTTP提供了GET、HEAD、POST、PUT、DELETE、TRACE、OPTIONS 七种基本操作。
按需代码
可选原则。指的是将可执行的软件程序,由服务端发送到客户端的技术。
不足和争议
面向资源编程只适合CRUD,只有面向对象,面向过程适合复杂的业务逻辑
HTTP的GET、POST、PUT、DELETE方法让人联想到CRUD,但是REST涵盖的内容不止于此。
比如对于删除操作,也可以使用自定义方法。
POST /api/user/id:deleteREST 与 HTTP 完全绑定,不适用于要求高性能传输的场景中
HTTP是应用层协议,REST的设计是依赖HTTP的协议头、请求方法、状态码。无法用做传输层协议。
REST 不利于事务支持
对于事物的理解:
如果是数据库的ACID的事物,这个分布式的问题,不是REST的问题。
如果是指通过服务协议或架构,在分布式服务中,获得对多个数据同时提交的统一协调能力(2PC/3PC),那 REST 确实不支持。
如果是指希望保证数据的最终一致性,说明已经放弃刚性事务了。这才是分布式系统中的主流,使用 REST 肯定不会有什么阻碍。
REST 没有传输可靠性支持
REST 并没有提供对传输可靠性的支持。在 HTTP 中,发送出去一个请求,通常会收到一个与之相对的响应。但是,如果没有收到任何响应,那就无法确定消息到底是没有发送出去,还是没有从服务端返回回来。
应对传输可靠性最简单粗暴的做法,就是把消息再重发一遍。这种简单处理能够成立的前提,是服务具有幂等性(Idempotency)。
Last updated
Was this helpful?