围绕面向服务的体系结构SOA(Service
Oriented
Architecture,SOA)的讨论很多,围绕如何正确实现SOA的讨论很多。如何构建灵活的异构系统,如何集成现有的系统,如何让异构系统进行通信?虽然当前主流的方式明显地集中在基于SOAP、WSDL和WS-*规范的Web
Services领域,但也有少数人主张更好的方式是REST,Restful
WebService,或者RESTful
HTTP。那什么是REST?
REST是
Representational
State
Transfer
(表述性状态转移)的缩写。为什么提这个名字?
Client
application
transfers
state
with
each
resource
representation.
This
is
REST.
通过超文本传输协议(HTTP)发送简单的消息来实现
SOA,这基本上就是
REST
式
Web
服务
(RESTful
Web
services)
的工作方式。REST并不是一个协议或技术;它是一种体系结构风格。
REST
是
SOAP
的轻量型替代品,它是面向资源的,而不是面向操作的。它常常被归结为远程过程使用
HTTP
调用
GET、POST、PUT
和
DELETE
语句。我认为,这只是第二个重要的步骤。
(第一个(也是最重要的)步骤是把所有资源建模为
URL
形式。)
(*)
REST比较简单朴素,在安全性,可靠消息传输,或标准化的业务过程自动化上还没有定义。(REST很适合面向数据的应用,但对于面向服务/面向方法的应用,比如需要事务、严密的安全性等等这些更高级的操作的应用来说,采用基于WS-*的方案显得更有道理。)
从基本原理层次上说,REST
样式和
SOAP
样式
Web
Service的区别取决于应用程序是面向资源的还是面向活动的。例如,在传统的WebService中,一个获得天气预报的webservice会暴露一个WebMethod:string
GetCityWether(string
city)。而RESTful
WebService暴露的不是方法,而是对象(资源),通过Http
GET,
PUT,
POST
或者
DELETE来对请求的资源进行操作。在
REST
的定义中,一个
Web
Service总是使用固定的
URI
向外部世界呈现(或者说暴露)一个资源。可以说这是一种全新的思维模式:使用唯一资源定位地址
URI,加上
HTTP
请求方法从而达到对一个发布于互联网资源的唯一描述和操作。
RESTful
HTTP核心操作包括:
GET
-
该操作返回已标识资源的状态表示。您可以通过大量的上下文要素来确定状态,例如谁正在提交请求、操作的参数(传入的参数如
HTTP
头或者查询字符串参数)和服务提供方维护的当前会话状态。
POST
-
该操作执行对已标识资源的一些特定于应用程序形式的更新。该操作行为完全依赖于实现它的服务。由该操作返回的数据也完全依赖于应用程序。举例来说,像
GET
操作一样,它可以返回一个状态表示,它还可以选择根本不返回任何数据。
PUT
-
该操作在已标识位置(URI)创建新资源。操作输入必须包括一个资源的状态表示。它完全依赖服务来创建基于这个状态表示的资源。
DELETE
-
DELETE
操作销毁已标识位置(URI)的资源。
REST是无状态的,服务器无需知道当前操作的上下文,或者上一次操作的情况。这能够提高系统的可伸缩性,是因为它强制所有操作都是stateless的,这样就没有context的约束,如果要做分布式、做集群,就不需要考虑context的问题了。同时,它令系统可以有效地使用pool。REST对性能的另一个提升来自其对client和server任务的分配:
server只负责提供resource以及操作resource的服务,而client要根据resource中的data和
representation自己做render。这就减少了服务器的开销。
在设计
REST
式
WebService时,可以采用以下四个步骤:
决定资源及其描述性
URL。(通过url来设计系统的结构则整个系统就是由这些resource组成的,注意设计思维方式的不同)
为每个
URL
上的通信选择一种数据格式。
指定每个资源上的方法。
指定返回的数据和状态码。
三、java端RESTful web services的几种实现方式【来源: BlogJava 作者:叱咤红人】
1、
利用JAX-WS的Dispatch/Provider对
在JAX-WS中,我们可以跳过SOAP栈的处理,直 接调用Service Endpoint,这样我们就可以传输POX(Raw xml)或者JSON给Service Endpoint处理,并可以通过MessageContext拿到HTTP method,从而进行判断,调用不同的逻辑。需要注意的是将Endpoint的@WebService替换成@WebServiceProvider, 需要实现Provider<Source>接口。接着将BindingType改为(value = HTTPBinding.HTTP_BINDING),表明直接处理的是HTTP,而不是SOAP。
Dispatch和Provider分别对应于客户端和服务端,他们当然是可以脱离使用的。
Provider脱离Dispatch
Get和Delete不需要通过HTTP body,本身就支持任意client
通过HTTP Header传post和put的内容,支持任意client
通过HTTP body传Post和Put的内容,需要模拟Dispatch传的HTTP body格式
Dispatch脱离Provider
自己生成SOAP包,服务端可以是SOAP-based web service
2、 RESTful HTTPServlets
所谓万变不离其中,REST本身就是HTTP的架构,我们可以直接通过HTTP servlet操控HTTP Request和Response,而且HTTP servlet本身就提供了doGet doPost doPut doDelete doHeader, doOptions方法,通过重写这些方法,我们可以实现基于HTTP servlet的RESTful web services
3、 JAX-RS
JAX-RS(JSR 311,Java API for XML-RESTful Web Services)是基于annotation的实现方式,我们通过annotation的方式把一个java class标注成RESTful web service,并把它的方法标注成HTTP的CRUD。相关的annotation有@path, @Produces,@GET, @POST, @DELETE, @PUT, @PathParam等,
目前已经有很多现成的实现,比如Jersey, Apache CXF, JBoss RESTEasy, Apache Wink. Triaxrs等
4、 其他的一些framework
还有一些其他的第三方的framework,可以方便我们发布RESTful web services,编写web client,比如Restlet。
四、服务的使用
在Spring Context中配置服务,按单例使用,避免频繁使用new,例如4A服务。
所有评论(0)