rest(Representational State Transfer,表述性状态转移)是一种跨平台的架构风格,不是一种新的技术,也不是一个标准。而常常提及的rest的web服务,是rest作为在web领域的一种实现方式。例如:简约是一种设计风格,而metro就是简约风作为在PC领域的展现。可能这个例子不太合适,但不难理解应该能说明这个问题。常说的JAX-RS标准则是java项目在实现rest风格的标准之一,简单来说就是按照这个JAX-RS标准就可以来取实现一个rest风格服务。而Jersey则是GlassFish其中一个实现了JAX-RS标准的子项目。在胡乱灌了很多的概念之后,到底什么是rest服务?怎么去实现才能是一个rest风格的服务呢?作者Roy Thomas Fieding在他的论文里面,提出了对于rest风格服务的几点约束。
通信发生在客户端和服务器之间,由客户端发起,服务器端响应。
所有的状态由客户端来维护,服务器端不维护或保存通信过程中的数据。
在通信过程中的数据能够被可选的中间件缓存,以此来提高web服务性能,更友好的服务体验。
系统之间应该是分层的,降低层之间的耦合性。
这个约束是可选的,在rest服务中支持JavaScript等Rich client语言。
说了很多,从上面几点来简单总结下rest是为解决web应用在互联网环境中出现的可伸缩性差(如:并发量增高),安全性,幂等性等问题而出现的一种分布式应用架构风格。而满足这些约束的应用程序或架构,就可以称之为restful。
说了很多,似乎有这么一种赶脚。rest的概念都这么多,为什么要抛弃之前已经相对成熟的soap(简单对象访问协议)?在这之前有必要去了解一下其他几个概念,URI,资源,统一接口标准这样些概念。
这个概念让我想起在初次接触OO(面向对象)编程时的场景。在web中的应用中的服务器上的文档、数据、表、甚至于一条数据都可以被抽象成一个资源。具体到什么程度,只要开发者能够理解并实现就可以。只要你的想象力足够,天空才是你的极限。
统一资源标识符,用来标识存在于web应用或者本地的资源。
统一接口,在rest风格中,使用标准的 HTTP 方法 (GET/PUT/POST/DELETE) 来抽象所有 Web 系统的服务。对于一个资源来讲,这种简单明了的设计一下子解放了开发者的负担。无论是客户端和服务器端,在编程上就更加的明了减少了开发的难度。这种简单对应CRUD的操作,对于一个资源来讲显然是足以了。当然在现实生产中远远比这来的更加凶猛,这也导致了一些rest设计时出现的一些限制或者出现一些不伦不类的架构设计。既不是rest,也非soap。
首先来讲rest和soap都是用来实现企业内部webservices来暴露内部API的一种方式。从rest和soap的风格上来说,rest更强调把内部的资源暴露,并提供简单明了的API(PUT,DELETE,GET, POST)来简化操作。而soap更贴近于RPC的实现方式,强调动作操作来暴露内部API。例如:getUserInfoByUserId,我们会经常看到这样的接口设计。另外,soap在交互过程中,使用的为XML的方式来进行接口的描述和response的定义。而rest除了xml之外,也支持json、html的方式。
如今实现rest除了上面说的Jersey,还有一些厂商基于了JAX-RS标准的实现。比较为大家所熟知的有JBoss社区的RestEasy和Apache的CXF。上面说过JAX-RS标准只是作为实现rest风格的一种方式,而比较火热的Spring MVC 则是区别于Jersey、RestEasy的另一种rest实现。