代表性状态 (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 流化。
有关 URI、CRUD、Mashup、Facade 模式、SOAP 样式的 Web 服务、RAS 模式、SAAJ 及其他资源的更多信息,请参见参考资料。
在 REST 样式的 Web 服务 Facade 组件中需要以下功能:
-
用于指示 REST 样式的资源的可自定义 URL
-
REST 体系结构样式支持采用 URL 来提供对细粒度资源的访问。例如,在贷款应用程序中,银行在特定日期提供的贷款利率就是一个必需的资源。通过使用不同的 URL 表示每个细粒度资源,可允许其他应用程序(如电子邮件)方便地引用这些资源。这还同时支持使用 Web 2.0 技术(如 Ajax)进行客户端资源组合。因此,Web 服务 Facade 组件允许应用程序开发人员自定义表示资源的 URL。
用于操作资源的 HTTP 方法,如 -
REST 样式的 Web 服务允许通过数量较少的常用操作访问资源,如用于获取资源的表示形式、获取关于资源的信息以及操作资源的各个独立操作。HTTP 协议已经定义了这样的操作集(
GET
、POST
、PUT
等等)。(有关 HTTP 方法的更多信息,请参见 参考资料。)Facade 组件支持使用这些 HTTP 方法。请注意,针对 SOAP Web 服务的 Web 服务描述语言(Web Service Description Language,WSDL)1.1 仅支持 HTTPPOST
方法。WSDL 2.0 通过包括对 HTTPGET
绑定的支持对此进行了补充,但在 WebSphere® Application Server V6.1 中尚不支持 WSDL 2.0。另请注意,HTTPDELETE
、PUT
、TRACE
和OPTIONS
方法使用并不频繁,而且经常被防火墙阻止。
资源表示形式和内容格式协商
-
URL 所访问的每个资源都可以使用不同的形式加以表示,具体取决于访问资源的客户机。客户机可以是台式计算机上的 HTML 浏览器或其他 SOAP Web 服务或 Ajax 或 JavaScript Object Notation (JSON) 客户机(请参见
参考资料)。Facade 组件查询 HTTP 请求的
Accept
Header 字段来确定客户机所需的响应格式,并随后以所需的格式提供资源。
资源表示形式的浏览器与网关代理缓存
-
REST 样式的结果最常用于使用 HTTP
GET
方法访问资源。对于 HTTPGET
请求,REST 样式的 Web 服务可以设置 HTTP 响应 Header 字段来提供指示信息,以确定 Web 浏览器是否缓存返回的资源表示形式以及缓存多长时间、要缓存的资源表示形式的有效或失效策略是什么。通过支持响应缓存,可提高应用程序的可伸缩性。 Facade 组件会相应地将 HTTP HeaderCache-Control
响应指令设置为PUBLIC
、PRIVATE
等。
使用 SAAJ 来调用 SOAP 样式的 Web 服务
- SOAP 样式的 Web 服务以 XML 形式返回响应,而此格式通常是 REST 样式客户机需要的资源表示形式。所以,Facade 组件可避免由于直接访问 XML 格式的 SOAP 响应消息而造成的不必要的取消封送开销。为此,Facade 组件使用 SAAJ 来调用现有的 Web 服务。SAAJ 还可以通过 HTTP 对 Web 服务响应中附件内的大量数据进行流化。
GET
、POST
、DELETE
、PUT
、TRACE
和 OPTIONS
。
REST 样式的 Web 服务 Facade 的 RAS 模式
简单而言,RAS 模式是一种可重用资产,描述给定上下文中重复出现的问题的解决方案(请参见参考资料部分,其中提供了指向 IBM Pattern Solution 网站的链接)。可以使用 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 中所示。
遵循以下步骤来创建模式实例:
- 依次单击 Window>Show View>PatternExplorer,打开 Pattern Explorer 视图。此模式应该在 WEB2.0 组下显示,如图 2 中所示。
图 2. 在 Pattern Explorer 视图中查看新模式 - 在 RSA 中打开 Modeling 透视图,并创建新建模项目。
- 在新创建的项目中创建一个空白 UML 模型。
- 将模式拖放到新创建的模型中。
现在已经创建了 RESTWebServiceFacade 模式的实例。下一步是填充参数。
在 RESTWebServiceFacade 模式实例中指定以下参数:
参数名 | 用途 |
---|---|
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 模式的模式实例
清遵循以下步骤将模式转换为 J2EE Servlet:
- 创建动态 Web 项目。
- 右键单击模式,并选择 Transform>Pattern to WebServiceFacadeServlet,如图 4 中所示。
- 指定在步骤 1 中新创建的 Web 项目。
图 5 显示了生成的包装 Servlet。
遵循以下步骤,以更新生成的代码,从而支持其他资源表示格式和从 SOAP 消息提取附件:
- 查看生成的 Servlet 代码:
- 通过扩展 J2EE
HttpServlet
抽象类和实现对应的 J2EE Servlet 方法(如doGet
、doPost
和doDelete
),可在生成的 Facade Servlet 中支持指定的 HTTP 方法。 - 清单 1 显示了生成的代码,该代码使用 SAAJ 调用了现有的 Web 服务。
清单 1. 用于使用 SAAJ 调用现有 SOAP Web 服务的代码示例
MessageFactorymessageFactory = MessageFactory.newInstance();
SOAPMessagemessage = messageFactory.createMessage();
// Createobjectsforthemessageparts
SOAPPartsoapPart = message.getSOAPPart();
SOAPEnvelopeenvelope = soapPart.getEnvelope();
SOAPBodybody = envelope.getBody();
envelope.getHeader().detachNode();
// Populatethebody
// Createthemainelementandnamespace
SOAPElementbodyElement = body.addChildElement(envelope
.createName(operation, " req " ,ns));
// Addcontent
bodyElement.addChildElement( " prodid " ).addTextNode(para0);
bodyElement.addChildElement( " prodtype " ).addTextNode(para1);
// Savethemessage
message.saveChanges();
URLendpoint = new URL(endPoint);
SOAPMessagerespMsg = connection.call(message,endpoint)
- 清单 2 显示了用于支持浏览器缓存的生成代码。
清单 2. 用于设置浏览器缓存 HTTP Header 的代码示例response.setHeader( " Cache-Control " , " public " );
- 清单 3 显示用于解析相应资源表示形式和恰当设置 MIME 内容类型的生成代码。
清单 3. 有关资源表示形式和内容格式协商的代码示例String[]pattern_accepts = ... {"text/xml"} ;
Stringreq_accepts = request.getHeader( " Accept " );
RESTResourceRepresentationContextrepContext =
new RESTResourceRepresentationContext();
Stringformat_decision = repContext.getAcceptFormat(pattern_accepts,
req_accepts);
response.setContentType(format_decision);
repContext.registerDefaultStrategies();
repContext.generateAppropriateResourceRepresentation(respMsg,printer);
- 通过扩展 J2EE
- 更新生成的代码。可能需要进行以下类型的代码更改:
- 支持新的资源表示格式。为了创建自定义应答格式,请通过从
RESTResponseStrategy
类继承并向RESTResourceRepresentationContext
类的registerStrategy()
操作进行注册来创建新策略。 - 使用 SAAJ 获取大型附件,以便通过 HTTP 进行流化。可以使用
SoapMessage#getAttachments()
方法来从 SOAP 信封提取附件。可以将采用这种方式提取的附件通过 HTTP 响应对象发送到客户机。
- 支持新的资源表示格式。为了创建自定义应答格式,请通过从
- 将 Web 项目部署到 J2EE 1.4 应用服务器中,如图 5 中所示。
- 使用从参数构造的 URL 调用 Facade :http://localhost:9080/<FacadeURLContextPath>/<FacadeURLServletPath>?<Parameter=value>[: Parameter=value]
- 按图 6 中的示例所示的方式在 REST 服务客户机中查看操作的结果。
可以对模式插件的源代码(请参见下载)进行修改,以捕获您的开发组织创建 REST 样式的 Web 服务 Facade 的最佳实践。
尽管 REST 体系结构样式在很多情况下都非常具有吸引力,但可能在某些情况下并不适合。以下就是一些这样的例子:
-
对于非结构化请求或响应格式,优先选用远程过程调用类型的服务调用。
- 例如,在两个帐户之间进行资金转帐的事务型 Web 服务就是如此。缺省情况下使用 REST 样式的 Web 服务并不提供事务完整性支持,但可以将此支持添加到 SOAP 样式的 Web 服务。 服务调用中涉及到多个协议。
- 例如,考虑要支持同步样式接口而不是异步样式接口。 需要通过业务流程执行语言(Business Process Execution Language,BPEL)集成到业务流程。
- 目前 BPEL 流程并不支持 REST 样式的接口。只有服务组件体系结构(Service Component Architecture,SCA)组件可以编排在 BPEL 流程中。
REST 样式 Web 服务 Facade 提供某些所需的功能,如多资源格式表示形式、支持响应的浏览器缓存以及支持 PUT
、TRACE
和 DELETE
等其他 HTTP 方法。本文提供的 RAS 模式资产捕获用于开发 REST 样式的 Web 服务 Facade 的最佳实践。
描述 | 名字 | 大小 | 下载方法 |
---|---|---|---|
REST Web Service RAS pattern | restsrc.zip | 318KB | HTTP |
RestFeature RAS files | RestFeature.ras | 525KB | HTTP |
![]() | ||||
![]() | 关于下载方法的信息 | ![]() |
学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
- 使用 RSS feed 获取有关本系列中即将推出的文章的通知。(了解有关 developerWorks 内容的 RSS feed 的信息。)
- 访问 Paul Prescod 网站获取一些 REST 资源。
- 阅读由因特网工程特别工作组 (IETF) 维护的 Uniform Resource Identifier (URI): A general syntax。
- 查看有关 CRUD、Facade 模式、Ajax、JSON 和 mashup 的维基百科条目。
- 简单对象访问协议(Simple Object Access Protocol,SOAP)是一项 WWW 联合会(World Wide Web Consortium,W3C)标准。
- 了解 Rational Software Architect 的 Reusable Asset Specification (RAS) 模式资产。
- Bankrate 对抵押贷款、存单、信用卡、汽车贷款等利率进行比较。
- SOAP with Attachments for Java (SAAJ) 提供了标准方法来从 Java 平台通过 Internet 发送 XML 文档。
- 查看 W3C 的 HTTP Header 字段定义和 HTTP 方法定义。
- 访问 IBM 模式解决方案(Pattern Solution)网站。
- Roy Fielding 的博士论文 Architectural Styles and the Design of Network-based Software Architectures(加利福尼亚州大学尔湾分校,2000 年)对 REST 体系结构样式进行了介绍。
- Architecture of the World Wide Web, Volume 1 是一项 W3C 建议草案。
- 了解有关 IBM Rational Software Architect (RSA) 和 WebSphere Application Server 的更多信息。
- 了解关于 developerWorks 技术事件和网络广播的最新消息。
- IBM SOA 网站提供了 SOA 的概述,并说明 IBM 可以如何帮助您实现此目标。
- 有关 SOA 的更多信息,请访问 developerWorks SOA 与 Web 服务专区。