使用REST体系结构样式构建可使用的Web服务

日期: 2008-08-04 作者:Javier GarciaQiang Wang 来源:TechTarget中国 英文

  本系列讨论如何开发组合应用程序来支持业务服务,本文是其中的第三篇文章。本文的重点是代表性状态传输(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流化。


  有关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方法,如GET、POST、delete、PUT、TRACE和OPTIONS。


  REST样式的Web服务允许通过数量较少的常用操作访问资源,如用于获取资源的表示形式、获取关于资源的信息以及操作资源的各个独立操作。HTTP协议已经定义了这样的操作集(GET、POST、PUT等等)。(有关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 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 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中所示。



  图1. 查看插件
 
  创建模式实例


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


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



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


  现在已经创建了RESTWebServiceFacade模式的实例。下一步是填充参数。


  指定模式参数


  在RESTWebServiceFacade模式实例中指定以下参数:
 
  表1. REST模式支持的参数



  图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:


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



  图4. 调用转换
 
  图5 显示了生成的包装Servlet。



  图5. 生成的包装Servlet
 
  更新、部署和调用生成的J2EE Servlet代码


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


  ·查看生成的Servlet代码:


  通过扩展J2EE HttpServlet抽象类和实现对应的J2EE Servlet方法(如doGet、doPost和dodelete),可在生成的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);
 
  ·更新生成的代码。可能需要进行以下类型的代码更改:


  支持新的资源表示格式。为了创建自定义应答格式,请通过从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服务客户机中查看操作的结果。



  图6. 使用Web浏览器访问REST包装
 
  模式插件的源代码


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


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


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


  对于非结构化请求或响应格式,优先选用远程过程调用类型的服务调用。


  例如,在两个帐户之间进行资金转帐的事务型Web服务就是如此。缺省情况下使用REST样式的Web服务并不提供事务完整性支持,但可以将此支持添加到SOAP样式的Web服务。


  服务调用中涉及到多个协议。


  例如,考虑要支持同步样式接口而不是异步样式接口。


  需要通过业务流程执行语言(Business Process &#101xecution Language,BPEL)集成到业务流程。


  目前BPEL流程并不支持REST样式的接口。只有服务组件体系结构(Service Component Architecture,SCA)组件可以编排在BPEL流程中。


  结束语


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


  作者简介


  Javier Garcia是一位拥有20多年开发经验的顾问软件工程师。他当前在SWG Strategy and Technology部门工作,工作重点是SOA和组合应用程序。
 
  Qiang Wang是China Technology Institute, China Software Development Laboratory的一位软件工程师。他的工作重点是IBM Incubator Project和SOA相关主题。他的兴趣包括J2EE、SOA、MDA/MDD、AOP和RUP。他当前从事与WBM、WebSphere Integration Developer和WPS相关的开发工作。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • SAP收购CallidusCloud 与Salesforce竞争

    一直被称为后台办公巨头的SAP现在似乎也想在前台办公大展拳脚。 最新的迹象是SAP收购CallidusClou […]

  • API开发与管理大作战

    2014将会是API管理方法新旧PK的一年,据Delyn Simons说,她领导了Mashery开发者的外展团队。应用编程接口(API)的主流化和私有化在新的一年也将掀起波澜,她在波士顿“Future Insights Ultimate Developer Event 2013”大会上预测说。

  • 公共API外包管理是否值得考虑?

    公共API外包管理是指聘请一个专家小组来解决可扩展性问题,同时也提出几套可替代的方案。

  • API设计如龙生九子 各不相同

    IT咨询管理公司CA Technologies对API产业做了个问卷调查,问卷内容涉及API设计风格以及管理部署的新动向。调查结果表明,JSON与XML可谓两分天下。