本系列讨论如何开发组合应用程序来支持业务服务,本文是其中的第三篇文章。本文的重点是代表性状态传输(Representational State Transfer,REST)体系结构样式。通过使用 Facade 组件作为 REST 样式的接口,现有的 SOAP 样式的 Web 服务支持可自定义的 URL、多资源格式表示、浏览器响应缓存、大型附件的流化以及使用 HTTP 方法来操作资源。
引言
代表性状态 (REST) 体系结构样式提供了壁垒较低的使用 Web 服务门槛。典型 REST 样式应用程序的外部接口包括大量统一资源标识符(Uniform Resource Identifier,URI)可寻址资源和一些操作,如创建、读取、更新和删除 (CRUD) 等。这样的体系结构样式的优势是其简单性。
开发人员兼作家 Paul Prescod 将 REST Web 服务定义为“使用 HTTP 协议的语法和语义将其功能完全作为一组 URI 可寻址资源提供的 Web 服务”。可以将万维网本身视为 REST 样式的例子。位于 Web 底层的 HTTP 协议使用统一资源定位符Uniform Resource Locator,URL)来表示资源和一些广泛使用的 HTTP 方法,如用于操作资源的 GET、POST、PUT、HEAD 和 DELETE。这个简单的体系结构样式通过重用 Web 的松散耦合与分布式基础设施来提供可伸缩性和交互能力。
本文给出了一个银行业务服务示例,该服务将贷款利率发布到类似于 Bankrate 的聚合器网站。聚合器网站通常从多个不同的提供商收集信息,并将其聚合为客户端 Mashup。这也称为透明地组合,可以将其视为组合应用程序。为了方便地创建此类 Mashup,服务提供商需要公开一个简化接口。REST 体系结构样式可很好地满足此要求。
本文建议使用Facade 组件 来向现有 SOAP 样式的 Web 服务提供 REST 样式的接口。本文描述组件所需的功能,并将这些功能捕获在 Rational® Software Architect 可重用资产规范(Reusable Asset Specification,RAS)模式中。此模式由端点和现有 Web 服务的操作进行参数化。可以将此模式转换为可部署的 Java™ 2 Enterprise Edition (J2EE) Servlet 实现,以调用现有 Web 服务。这个生成的 Servlet 支持所需的 REST 样式功能,如浏览器缓存、资源内容格式协商和使用 SOAP Attachment for Java (SAAJ) 标准进行大型附件的 HTTP 流化。
REST 样式的 Facade 组件所需的功能
在 REST 样式的 Web 服务 Facade 组件中需要以下功能: 用于指示 REST 样式的资源的可自定义 URL REST 体系结构样式支持采用 URL 来提供对细粒度资源的访问。例如,在贷款应用程序中,银行在特定日期提供的贷款利率就是一个必需的资源。通过使用不同的 URL 表示每个细粒度资源,可允许其他应用程序(如电子邮件)方便地引用这些资源。这还同时支持使用 Web 2.0 技术(如 Ajax)进行客户端资源组合。因此,Web 服务 Facade 组件允许应用程序开发人员自定义表示资源的 URL。
用于操作资源的 HTTP 方法,如 GET、POST、DELETE、PUT、TRACE 和 OPTIONS。 REST 样式的 Web 服务允许通过数量较少的常用操作访问资源,如用于获取资源的表示形式、获取关于资源的信息以及操作资源的各个独立操作。HTTP 协议已经定义了这样的操作集(GET、POST、PUT 等等)。Facade 组件支持使用这些 HTTP 方法。请注意,针对 SOAP Web 服务的 Web 服务描述语言(Web Service Description Language,WSDL)1.1 仅支持 HTTP POST 方法。WSDL 2.0 通过包括对 HTTP GET 绑定的支持对此进行了补充,但在 WebSphere® Application Server V6.1 中尚不支持 WSDL 2.0。另请注意,HTTP DELETE、PUT、TRACE 和 OPTIONS 方法使用并不频繁,而且经常被防火墙阻止。资源表示形式和内容格式协商 URL 所访问的每个资源都可以使用不同的形式加以表示,具体取决于访问资源的客户机。客户机可以是台式计算机上的 HTML 浏览器或其他 SOAP Web 服务或 Ajax 或 JavaScript Object Notation (JSON) 客户机。Facade 组件查询 HTTP 请求的 Accept Header 字段来确定客户机所需的响应格式,并随后以所需的格式提供资源。资源表示形式的浏览器与网关代理缓存 REST 样式的结果最常用于使用 HTTP GET 方法访问资源。对于 HTTP GET 请求,REST 样式的 Web 服务可以设置 HTTP 响应 Header 字段来提供指示信息,以确定 Web 浏览器是否缓存返回的资源表示形式以及缓存多长时间、要缓存的资源表示形式的有效或失效策略是什么。通过支持响应缓存,可提高应用程序的可伸缩性。Facade 组件会相应地将 HTTP Header Cache-Control 响应指令设置为 PUBLIC、PRIVATE 等。
使用 SAAJ 来调用 SOAP 样式的 Web 服务 SOAP 样式的 Web 服务以 XML 形式返回响应,而此格式通常是 REST 样式客户机需要的资源表示形式。所以,Facade 组件可避免由于直接访问 XML 格式的 SOAP 响应消息而造成的不必要的取消封送开销。为此,Facade 组件使用 SAAJ 来调用现有的 Web 服务。SAAJ 还可以通过 HTTP 对 Web 服务响应中附件内的大量数据进行流化。
REST 样式的 Web 服务 Facade 的 RAS 模式
简单而言,RAS 模式是一种可重用资产,描述给定上下文中重复出现的问题的解决方案。可以使用 IBM Rational Software Architect (RSA) 之类的工具来捕获模式,以自动化解决方案开发工作。下面的部分将对 RAS 模式进行描述,用以捕获 REST 样式的 Web 服务 Facade 的所需功能。
下载和安装模式
请参见下载部分,其中提供了打包为可重用资产的一个 REST 模式和一个转换插件。通过以下步骤将此资产安装到 RSA 中:
解压缩下载包。
在 Rational Software Architect 中,通过 File>Import 窗口导入 RestFeature.ras 资产。在 Import 窗口中选择 RAS Asset 类型。通过向导页来导入此资产。
单击 Help>About IBM Rational Software Development Platform。
要验证插件是否已成功安装,请在 Plug-ins Details 窗口中找到 RestPattern Plug-in 和 RestPatternTransform Plug-in,如图 1 中所示。
图 1. 查看插件

创建模式实例
遵循以下步骤来创建模式实例:
依次单击 Window>Show View>PatternExplorer,打开 Pattern Explorer 视图。此模式应该在 WEB2.0 组下显示,如图 2 中所示。
图 2. 在 Pattern Explorer 视图中查看新模式

在 RSA 中打开 Modeling 透视图,并创建新建模项目。
在新创建的项目中创建一个空白 UML 模型。
将模式拖放到新创建的模型中。
现在已经创建了 RESTWebServiceFacade 模式的实例。下一步是填充参数。
指定模式参数
在 RESTWebServiceFacade 模式实例中指定以下参数:
表 1. REST 模式支持的参数
参数名 |
用途 |
ExistingWebServiceEndPoint |
现有 SOAP Web 服务的端点,此模式将为其生成 J2EE Servlet Facade。可以在 SOAP Web 服务的 WSDL 文件中找到此值。 |
NameSpace |
现有 SOAP Web 服务的命名空间。构造 SOAP 请求消息时将使用此参数。可以在 SOAP Web 服务的 WSDL 文件中找到此值。 |
Operation |
访问其感兴趣的资源的现有 Web 服务中的单个操作。 |
Parameter |
调用操作所需的所有参数的列表。 |
FacadeURLContextPath |
目标 Web 项目的上下文路径。此值是用于访问 REST 样式的服务的 URL 的第一部分内容。多个 J2EE Web 组件可以共享一个上下文路径。 |
FacadeURLServletPath |
指定用于访问此 Facade 所代表的资源的 URL 中的可自定义部分。 |
HTTPMethod |
受支持的 HTTP 方法的列表。目前仅支持 GET、POST 和 DELETE。 |
ReplyFormat |
受支持的资源表示格式(例如 XML 或 HTML)。Facade 检查 HTTP 请求的 Accept Header,以确定是否请求了任何受支持的格式,如果是,则以请求的格式提供资源。 |
Cache |
指定响应是否为可缓存,通过将 HTTP 响应 Header 的 Cache-Control 设置为 Public 可指定为可缓存。 |
图 3 显示模式的一个实例。可以使用以下参数将此实例作为现有 Web 服务的 Facade 使用:
端点为 http://localhost:9081/RESTRouter/service/RatesFacade。
操作名为 queryRate。
命名空间为 http://ejbs。
参数为 prodId(具有类似于 Mortgage 的值)和 prodType(具有类似于 30-year fixed 的值)。
用于访问 REST 样式的资源的示例 URL:http://localhost:9080/bank/rate?prodId=Mortgage&prodType=30-year%20fixed,其中 servletPath 是在 /rate 参数中指定的,而 contextPath 是作为 /bank 指定的。服务响应中支持的资源表示格式为 XML 和 HTTP,如果公开提供就可以对响应进行缓存。
图 3. RESTWebServiceFacade 模式的模式实例

(编辑:aniston)
|