什么是 REST 风格

REST是REpresentational State Transfer 的缩写,那它究竟意味着什么呢?也许这个问题已经困惑你很久了,下面就由包子给你细细分解。

你好 REST

从宏观上讲,REST 是一种设计网络应用时的构架风格。这种风格约束了网络应用中各个模块之间的交互,从而使网络应用具有非常好的简易性,扩展性,可靠性等。
具体来说,REST描述了以抽象的“资源”为中心,各个模块之间通过转移(Transfer)沟通资源的“表征状态 (Representational State)”来实现应用的功能。

在REST里,“资源”是一切可命名事物的抽象。可以是一个人,可以是一个图片,也可以是北京的天气。有些资源是静态不变的,也有些是一直变化的,所以在模块获取资源的时候,我们REST构架下传递的是这个资源的某个“表征状态”。比如对于“北京时间”这个资源,传递这个资源的时候,我们可以把当下时间点这个状态通过某种方式出来后传递。

REST 赋予所有需要被外界使用的资源一个唯一的ID,不同的模块可以通过这个资源ID来获取资源(的表征状态)。 在这里我们可能已经注意到了,和某些分布式构架不同的是,REST暴露的是“接口资源”,而不是“接口操作”。虽然操作本身也可以作为资源被不同模块获取,但是这表明了一种不同的抽象方式。

亲密接触 REST

说到这里,大家也许觉得 REST 非常地高大上,但其实 REST 的出生还是十分接地气的。REST 设计风格是源自于现实生活中的“超媒体网络 (hyper media network)”。换句话说,我们基于HTTP 的万维网从很多方面来看都具有REST的影子。我们最常见的HTTP协议,给出了一个实际好用的REST 实现方案。在HTTP 协议中,每一个页面(资源)都有一个对应的 URI (资源ID),通过对URI的调用,加上HTTP 协议中的Verb (GET, POST, PUT, DELETE, 等)来获取操控资源。比如GET 操作,将当前状态的资源以HTML,图片等形式(表征状态)从服务器转移到了客户端(浏览器);而 POST 操作又是通过客户端的表征状态转移到服务端来创建资源。

当然,这并不是说我们所有的基于HTTP的网站都是提供REST服务的。因为符合REST风格的构架还必须符合一些性质,只有这样才能达到其扩展性,简单性,高效性等。下面我们来列举一下这些必须满足的性质:

  1. 客户端和服务端的分割:REST 构架要求是基于客户端和服务端的。客户端不关心数据的存储,而服务端不关心用户的交互和会话的状态。这样可以做到客户端的可替换性,和服务端的兼容性。
  2. 客户端和服务端之间通信的统一规范性:
    • 所有的通信都是基于资源的,通信的内容都是资源的表征状态;
    • 客户端通过表征状态就可以创建读取修改资源;
    • 所有的通信都是自解释的,每条消息都有足够的信息来告诉对方自己应该被如何解析;
    • 使用超媒体来作为传送的表征状态;服务端往往会在表征状态中加入其他资源链接的方式让客户端可以在下一次通信中获取其他资源。
  3. 客户端和服务端直接可以插入很多层:这样服务端可以被很容易地扩展为负载平衡服务器组,或者通过加入加密层来保护通信内容。
  4. 服务端是无状态的:符合REST风格的服务端不应该保存任何用户状态,而是在客户端保存用户会话的状态。这样的好处是明显降低服务器开销,提高快速错误恢复的能力。
  5. 服务端给客户端按需提供Code资源:这是一个可选风格,但是它在很多REST应用中却非常重要,因为它使得不改变客户端就可以扩展客户端的功能。简单的说,这种风格是将逻辑代码也看成是一种资源,可以自由从服务端取得,并到客户端上面执行。比如浏览器从服务端下载一段javascript 代码资源,并执行它来达到用户的某个需求。

以上的5条属性中,除了第五条以外,其它的任意一条不满足的服务就不能被称作REST服务。

总结

在这一讲中,包子给大家总结了很多关于REST的概念。如果你一下子不能理解,也没有关系,我们在以后的博客中会以RESTful的HTTP实现为例子,具体阐述一些REST风格的编码,敬请关注。

最后也给大家推荐一个视频: https://www.youtube.com/watch?v=llpr5924N7E,它从一个practical 的角度讲解了REST 基于HTTP构架的特征。

博客推送