构建 SOA 组合业务服务,第 3 部分: 在 WebSphere 中使用 REST 体系结构样式构建可使用的 Web 服务

 

引言

代表性状态 (REST) 体系结构样式提供了壁垒较低的使用 Web 服务门槛。典型 REST 样式应用程序的外部接口包括大量统一资源标识符(Uniform Resource Identifier,URI)可寻址资源和一些操作,如创建、读取、更新和删除 (CRUD) 等。这样的体系结构样式的优势是其简单性。

开发人员兼作家 Paul Prescod 将 REST Web 服务定义为“使用 HTTP 协议的语法和语义将其功能完全作为一组 URI 可寻址资源提供的 Web 服务”(请参见参考资料)。可以将万维网本身视为 REST 样式的例子。位于 Web 底层的 HTTP 协议使用统一资源定位符Uniform Resource Locator,URL)来表示资源和一些广泛使用的 HTTP 方法,如用于操作资源的 GETPOSTPUTHEADDELETE。这个简单的体系结构样式通过重用 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 样式的 Facade 组件所需的功能

在 REST 样式的 Web 服务 Facade 组件中需要以下功能:

用于指示 REST 样式的资源的可自定义 URL
REST 体系结构样式支持采用 URL 来提供对细粒度资源的访问。例如,在贷款应用程序中,银行在特定日期提供的贷款利率就是一个必需的资源。通过使用不同的 URL 表示每个细粒度资源,可允许其他应用程序(如电子邮件)方便地引用这些资源。这还同时支持使用 Web 2.0 技术(如 Ajax)进行客户端资源组合。因此,Web 服务 Facade 组件允许应用程序开发人员自定义表示资源的 URL。

用于操作资源的 HTTP 方法,如 GETPOSTDELETEPUTTRACEOPTIONS
REST 样式的 Web 服务允许通过数量较少的常用操作访问资源,如用于获取资源的表示形式、获取关于资源的信息以及操作资源的各个独立操作。HTTP 协议已经定义了这样的操作集( GETPOSTPUT 等等)。(有关 HTTP 方法的更多信息,请参见 参考资料。)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 DELETEPUTTRACEOPTIONS 方法使用并不频繁,而且经常被防火墙阻止。

资源表示形式和内容格式协商
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 响应指令设置为 PUBLICPRIVATE 等。

使用 SAAJ 来调用 SOAP 样式的 Web 服务
SOAP 样式的 Web 服务以 XML 形式返回响应,而此格式通常是 REST 样式客户机需要的资源表示形式。所以,Facade 组件可避免由于直接访问 XML 格式的 SOAP 响应消息而造成的不必要的取消封送开销。为此,Facade 组件使用 SAAJ 来调用现有的 Web 服务。SAAJ 还可以通过 HTTP 对 Web 服务响应中附件内的大量数据进行流化。

REST 样式的 Web 服务 Facade 的 RAS 模式

简单而言,RAS 模式是一种可重用资产,描述给定上下文中重复出现的问题的解决方案(请参见参考资料部分,其中提供了指向 IBM Pattern Solution 网站的链接)。可以使用 IBM Rational Software Architect (RSA) 之类的工具来捕获模式,以自动化解决方案开发工作。下面的部分将对 RAS 模式进行描述,用以捕获 REST 样式的 Web 服务 Facade 的所需功能。

下载和安装模式

请参见下载部分,其中提供了打包为可重用资产的一个 REST 模式和一个转换插件。通过以下步骤将此资产安装到 RSA 中:

  1. 解压缩下载包。
  2. 在 Rational Software Architect 中,通过 File>Import 窗口导入 RestFeature.ras 资产。在 Import 窗口中选择 RAS Asset 类型。通过向导页来导入此资产。
  3. 单击 Help>About IBM Rational Software Development Platform
  4. 要验证插件是否已成功安装,请在 Plug-ins Details 窗口中找到 RestPattern Plug-in 和 RestPatternTransform Plug-in,如图 1 中所示。


图 1. 查看插件
图 1. 查看插件

创建模式实例

遵循以下步骤来创建模式实例:

  1. 依次单击 Window>Show View>PatternExplorer,打开 Pattern Explorer 视图。此模式应该在 WEB2.0 组下显示,如图 2 中所示。

    图 2. 在 Pattern Explorer 视图中查看新模式


  2. 在 RSA 中打开 Modeling 透视图,并创建新建模项目。
  3. 在新创建的项目中创建一个空白 UML 模型。
  4. 将模式拖放到新创建的模型中。

现在已经创建了 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 方法的列表。目前仅支持 GETPOSTDELETE
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

清遵循以下步骤将模式转换为 J2EE Servlet:

  1. 创建动态 Web 项目。
  2. 右键单击模式,并选择 Transform>Pattern to WebServiceFacadeServlet,如图 4 中所示。
  3. 指定在步骤 1 中新创建的 Web 项目。


图 4. 调用转换
图 4. 调用转换

图 5 显示了生成的包装 Servlet。


图 5. 生成的包装 Servlet
图 5. 生成的包装 Servlet

更新、部署和调用生成的 J2EE Servlet 代码

遵循以下步骤,以更新生成的代码,从而支持其他资源表示格式和从 SOAP 消息提取附件:

  1. 查看生成的 Servlet 代码:
    • 通过扩展 J2EE HttpServlet 抽象类和实现对应的 J2EE Servlet 方法(如 doGetdoPostdoDelete),可在生成的 Facade Servlet 中支持指定的 HTTP 方法。
    • 清单 1 显示了生成的代码,该代码使用 SAAJ 调用了现有的 Web 服务。

      清单 1. 用于使用 SAAJ 调用现有 SOAP Web 服务的代码示例
      MessageFactory messageFactory  =  MessageFactory.newInstance();
      SOAPMessage message 
      =  messageFactory.createMessage();

      // Create objects for the message parts
      SOAPPart soapPart  =  message.getSOAPPart();
      SOAPEnvelope envelope 
      =  soapPart.getEnvelope();
      SOAPBody body 
      =  envelope.getBody();
      envelope.getHeader().detachNode();

      // Populate the body
      // Create the main element and namespace
      SOAPElement bodyElement  =  body.addChildElement(envelope
                  .createName(operation, 
      " req " , ns));

      // Add content
      bodyElement.addChildElement( " prodid " ).addTextNode(para0);
      bodyElement.addChildElement(
      " prodtype " ).addTextNode(para1);

      // Save the message
      message.saveChanges();

      URL endpoint 
      =   new  URL(endPoint);
      SOAPMessage respMsg 
      =  connection.call(message, endpoint)

    • 清单 2 显示了用于支持浏览器缓存的生成代码。

      清单 2. 用于设置浏览器缓存 HTTP Header 的代码示例
      response.setHeader( " Cache-Control " " public " );

    • 清单 3 显示用于解析相应资源表示形式和恰当设置 MIME 内容类型的生成代码。

      清单 3. 有关资源表示形式和内容格式协商的代码示例
      String[] pattern_accepts = {"text/xml"} ;
         String req_accepts 
      =  request.getHeader( " Accept " );
         RESTResourceRepresentationContext repContext 
      =  
      new  RESTResourceRepresentationContext();
         String format_decision 
      =  repContext.getAcceptFormat(pattern_accepts,
                  req_accepts);

         response.setContentType(format_decision);
         repContext.registerDefaultStrategies();
      repContext.generateAppropriateResourceRepresentation(respMsg,printer);

  2. 更新生成的代码。可能需要进行以下类型的代码更改:
    • 支持新的资源表示格式。为了创建自定义应答格式,请通过从 RESTResponseStrategy 类继承并向 RESTResourceRepresentationContext 类的 registerStrategy() 操作进行注册来创建新策略。
    • 使用 SAAJ 获取大型附件,以便通过 HTTP 进行流化。可以使用 SoapMessage#getAttachments() 方法来从 SOAP 信封提取附件。可以将采用这种方式提取的附件通过 HTTP 响应对象发送到客户机。
  3. 将 Web 项目部署到 J2EE 1.4 应用服务器中,如图 5 中所示。
  4. 使用从参数构造的 URL 调用 Facade :http://localhost:9080/<FacadeURLContextPath>/<FacadeURLServletPath>?<Parameter=value>[: Parameter=value]
  5. 按图 6 中的示例所示的方式在 REST 服务客户机中查看操作的结果。


图 6. 使用 Web 浏览器访问 REST 包装

 

模式插件的源代码

可以对模式插件的源代码(请参见下载)进行修改,以捕获您的开发组织创建 REST 样式的 Web 服务 Facade 的最佳实践。

何时不使用 REST 体系结构样式

尽管 REST 体系结构样式在很多情况下都非常具有吸引力,但可能在某些情况下并不适合。以下就是一些这样的例子:

对于非结构化请求或响应格式,优先选用远程过程调用类型的服务调用。
例如,在两个帐户之间进行资金转帐的事务型 Web 服务就是如此。缺省情况下使用 REST 样式的 Web 服务并不提供事务完整性支持,但可以将此支持添加到 SOAP 样式的 Web 服务。
服务调用中涉及到多个协议。
例如,考虑要支持同步样式接口而不是异步样式接口。
需要通过业务流程执行语言(Business Process Execution Language,BPEL)集成到业务流程。
目前 BPEL 流程并不支持 REST 样式的接口。只有服务组件体系结构(Service Component Architecture,SCA)组件可以编排在 BPEL 流程中。

结束语

REST 样式 Web 服务 Facade 提供某些所需的功能,如多资源格式表示形式、支持响应的浏览器缓存以及支持 PUTTRACEDELETE 等其他 HTTP 方法。本文提供的 RAS 模式资产捕获用于开发 REST 样式的 Web 服务 Facade 的最佳实践。

下载

描述名字大小下载方法
REST Web Service RAS patternrestsrc.zip318KBHTTP
RestFeature RAS filesRestFeature.ras525KBHTTP
关于下载方法的信息


参考资料

学习

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值