REST是什么?

REST是利用传统Web特点,提出提出一个既适于客户端应用又适于服务端的应用的、统一架构,HTTP客户端与HTTP服务器之间的差别,对架构来说无所谓。一个软件应可以既充当Web客户端又充当Web服务器,而无须采用两套完全不同的APIs。

而传统SOA/JMS/Web服务等技术架构则侧重于服务器端,并没有从客户端和服务器端整体提出一个解决方案,为什么SUN忽略了这个重大架构主题呢?因为SUN的大头梦是客户端也用Java,这样,现在Java服务器端的解决方案就可以延伸到客户端,可惜只是南柯一梦罢了。

REST试图统一基于客户端和服务器的C/S或B/S模式、服务器与服务器之间集成模式,它不是像Java那样从语言平台入手,而是从普遍Http协议入手,这是又被众多厂商忽视的领域,虽然Web服务也曾蹂躏过Http协议,但是不同点在于两个:将Http和服务器端服务耦合在一起;业务粒度过于粗糙,见REST与RPC SOAP(http://www.jdon.com/jivejdon/thread/36506.html)。

由于REST要从一个高度统一集成模式,那么必然它提出的一些理念是本质的,也就是说,现在很多人都说不清楚B/S的Web架构为什么今天这么流行,仅仅因为内容多吗?肯定有其生存发展的内在道理,只不过这种道理是大道至简的道理,很容易被我们忽视,但是对于架构师来说,就不能不敏感了。

Web架构本质是遵循了分离关注模式模式,能将用户界面和数据存储分离,提高用户界面跨多个服务平台;同时提高和简化服务器组件的可伸缩性。可以形成跨多个组织之间Internet-scale 级别的需求。

所以,REST提出软件的动态分离部署特性,同时也提出无态通讯的特点(CSS:client-stateless-server ),CSS能够提高软件的可视化visibility, 可靠性reliability, a和伸缩性 scalability,缺点是增加网络负载,每发一次请求需要传送很多参数。

可以采取将应用状态放在客户端一边,也能降低服务器端对于同一个业务控制一致性的难度(如EJB是通过有态Bean等事务实现)。在客户端设置Cache缓存,形成client-cache-stateless-server模式,能够降低网络通讯负载。

统一的接口,REST包含四个接口: 资源标识identification of resources(采取URL形式); 通过界面技术(如html)的资源操作; 自我描述信息; 超媒体作为应用状态的引擎。

REST要求代码是即用即取Code On Demand,这里的Code可能是javascript或applet,代码被下载然后运行。

这里Roy又对java客户端applet进行了冷静分析,有专门Java versus JavaScript,阐述为什么JavaScript好于Java:
http://www.ics.uci.edu/~fielding/pubs/dissertation/evaluation.htmsec_6_5_4_3

同时解释了为什么在JavaScript比Java更成功,当然不是因为技术,也不是因为市场。原因有几个:
1.JavaScript比较适合Web的部署方式。
2.低门槛,对于非程序员方便
3.透明性,JavaScript几乎不影响互动调用,而java则因为安全机制变得不透明。
4.JavaScript不容易引起用户感知的延迟,因为它是和Html同时下载的,而Java Applet需要整个包下载安装。

虽然现在SUN推出了JavaFX,也没有改变上面第四条部署特点,所以JavaFX未来前途难料啊。

另外,Javascript也符合REST定义中的hyptertext超文本,是和云计算整合的RESTful点,见:
Code on Demand, REST, 和 Cloud Computing
http://bitworking.org/news/355/code-on-demand-rest-and-cloud-computing

参考资料:http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm