REST全称是Representational State Transfer,中文意思是表现层(编者注:通常译为表征)状态转化, 它首次出现在2000年Roy Fielding的博士论文中。 Roy Fielding在论文中提到:"我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。REST指的是一组架构约束条件和原则。"
REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力, 更好地使用现有Web标准中的一些准则和约束。虽然REST本身受Web技术的影响很深, 但是理论上REST架构风格并不是绑定在HTTP上,只不过目前HTTP是唯一与REST相关的实例。
RESTful架构的特点:
依据Roy Fielding在论文中的说法,一个系统架构要被判定为RESTful架构必须满足以下几个条件:
1、统一的接口:同一个资源,它对外暴露的接口地址(即url)是一致的,不同的操作通过HTTP的几个动词(POST:新增数据、GET:获取数据、PUT:更新数据、PATCH:更新数据、DELETE:删除数据)来区分。
2、无状态:RESTful架构完全使用HTTP协议,而HTTP协议是无状态的,因此客户端发送的请求里必须包含要全部的信息(包括要改变的状态),服务器处理后将处理后的信息(包括改变后的状态)也通过请求头或请求主体传递给客户端。
3、可缓存:服务器响应必须隐含地或明确地将其自身定义为可缓存的,以防止客户端在下一次请求时使用陈旧或不适当的数据,造成重复请求。 管理良好的缓存可以部分或完全避免一些不必要的客户端/服务器交互,进一步提高了可伸缩性和性能。
4、客户端/服务器模式:统一的接口将客户端与服务器分开。 这种分离意味着,客户端不用关心数据存储,数据存储仍然在每个服务器的内部,从而提高了客户端代码的可移植性。服务器不关心用户界面或用户状态,因此服务器可以更简单,更具可扩展性。 服务器和客户端也可以独立更换和开发,只要界面没有改变。
5、分层系统:分层系统通过约束组件的行为来降低系统复杂度,组件不能越过它们的媒介层去访问其它层。通过组件的阻断来保持层间的独立性。遗留的组件可以被封装成新的层,不让旧的客户端访问。媒介层可以通过负载均衡来提升伸缩性。分层系统存在的主要不足,是它给数据处理增加了一些额外的开销,增加了延迟,对用户体验有所影响。
6、按需编码(这个条件可有可无):REST允许客户端通过下载执行脚本来扩展它们的功能,简化了客户端,也提升了扩展性。但这同时也降低了可见性,所以这个约束不是必须遵循的。
简单归纳起来就是:
(1)每一个URI代表一种资源;
(2)客户端和服务器之间的交互过程就是传递这种资源的某种表现层的过程;
(3)客户端通过GET(获取数据)、POST(新增数据)、PATCH(更新数据)、PUT(更新数据)、DELETE(删除数据)五个HTTP动词请求统一接口,对服务器端资源进行操作,实现"表现层状态转化"。
(4)RESTful架构的API应该像WEB页面一样,通过超媒体(类似WEB页面的超链接)建立起一个API与另一个API之间的关系(类似WEB页面里通过超链接进行不同页面之间的切换),即每个API返回的数据中应该包含当前请求接口地址和相关联的接口地址。
我们通过url访问一个网站,就代表了客户端和服务器的一个互动过程。客户端通过url访问网站服务器的过程,就是获取服务器资源(这个服务器资源可以是一段文本、一张图片,也可以是一首歌曲,甚至是一种服务)的过程。在这个过程中,势必涉及到数据和状态的变化,但是互联网通信协议HTTP协议是一个无状态协议,这就意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。在restful架构里,客户端通过GET、POST、PUT、DELETE四个HTTP动词,对服务器端资源进行操作,从而实现"表现层状态转化"。
RESTful架构的优点
根据上面对RESTful架构的特点的描述,我们可以总结RESTful架构的优点主要有以下几点:
1. 简单、轻量。
RESTful架构完全基于HTTP协议,充分利用HTTP协议的特点,通过统一接口,使用GET、POST、PATCH、PUT、DELETE等HTTP动词来区分获取、新增、更新和删除等不同操作。
2. 面向资源,一目了然,具有自解释性。
在RESTful架构中一切都是资源,用户通过URL访问网站就是请求网站服务器上的资源。每一个URI标示了一个唯一的资源。服务器对每个请求的响应中,不仅包含有用户需要的数据,还包含有与请求相关的其他信息,让客户端不用查看文档也大概知道下一步如何操作,如在header中增加Link头告诉客户端怎么访问下一页和最后一页的记录。
3. 数据描述简单,一般以XML,JSON做数据交换(现在主要使用JSON)。
所以相对于传统的接口调用方式,使用RESTful架构的API,还是有很大优势的。
注意
PUT 用于更新资源的全部信息,在请求的 body 中需要传入修改后的全部资源主体;而 PATCH 用于局部更新,在 body 中只需要传入需要改动的资源字段。
设想服务器中有以下用户资源 /api/users/123
当我们往后台发送更新请求时,PATCH 和 PUT 造成的效果是不一样。
上述 PUT 请求操作后的内容是:
可以观察到,资源原有的 age 字段被清除掉了。
而如果改用 PATCH 的话:
更新后的内容是:
请求中指定的 name 属性被更新了,而原有的 age 属性则保持不变。
PATCH 的作用在于如果一个资源有很多字段,在进行局部更新时,只需要传入需要修改的字段即可。否则在用 PUT 的情况下,你不得不将整个资源模型全都发送回服务器,造成网络资源的极大浪费。
本文为崔凯原创文章,转载无需和我联系,但请注明来自冷暖自知一抹茶ckhttp://www.cksite.cn