SOAP Web Service的RPC风格与Document风格

style

SOAP Web Service有两种风格(style),RPC和Document。

RPC

RPC style有由SOAP标准定义的固定的SOAP消息body格式要求,由远程调用的方法名元素包裹着许多个参数元素构成,由于有固定的格式,marshalling/unmarshalling是标准中的一部分,SOAP库自动化这个过程。RPC风格的服务对应用程序代码的耦合较紧。

<soap:envelope>
  <soap:body>
    <add>    <!-- method name -->
      <a>1</a>  <!-- 1st parameter -->
      <b>2</b>    <!-- 2nd parameter -->
    </add>
  </soap:body>
</soap:envelope>

Document

Document style没有固定的SOAP消息body格式的要求,只要其符合xml schema定义即可,由于消息结构可自定义,marshalling/unmarshalling需要应用程序自己完成。Document风格的服务对应用程序代码的耦合较松,Document风格也被成为Message oriented风格。

<soap:envelope>
  <soap:body>
    <!-- any xml content -->
    <fruits xmlns="http://ourway.top">
      <apple>
        <color>red</color>
        <qulity>good</qulity>
      </apple>
      <grape>
        <color>green</color>
        <qulity>middle</qulity>
       </grape>
    </fruits>
  </soap:body>
</soap:envelope>

Document风格的WSDL比起RPC风格的WSDL因为要包括更多信息,在结构上要更为复杂 ,RPC风格的WSDL中甚至没有“types”定义。

use

有两种use:encodedliteral

encoded use

SOAP消息体的元素符合SOAP encoded规定的格式定义,使用xml schema的类型来描述参数,其不兼容WS-I(Web Service Interoperability),所以不同语言,平台实现的服务之间可能存在一定的不兼容性。

literal use

SOAP消息体的元素没有特殊的规定,只要符合xml schema的格式定义即可。

style和use的组合

style和use组合可以有四种结果 RPC/encoded, RPC/literal, Document/encoded, Document/literal

RPC/encoded

SOAP body的格式符合SOAP标准中对RPC style, encoded的定义

RPC/literal

SOAP body的格式符合SOAP标准中对RPC style的定义,同时其参数元素符合自定义的xml schema

Document/encoded

SOAP body的格式符合Document style,但是其参数元素符合SOAP标准中对encoded的定义,该模式基本没被使用

Document/literal

SOAP body的格式符合自定义xml schema

RPC到Document的过度是业界的趋势,但是Document/literal模式下的Web Service在SOAP消息中失去了方法名,导致有的情况下不能正确的分发消息,甚至直接不可能分发,比如两个有着同样参数签名的方法,由于Document/literal模式下的请求消息中只有参数信息,所以是无法决定该消息应该传递给哪一个方法。

Document/literal Wrapped是一种同时提供RPC和Document风格优势的技巧,被作为事实上的标准被使用,其通过用单个元素包裹所有参数元素,实现了类似RPC/literal模式下的消息结构,这个元素的名称可以作为请求的方法名称被处理,从而解决了Document/literal模式下没有方法名称的问题。

Java界对SOAP Web Service早期的标准JAX-RPC是RPC/encoded模式,而目前的JAX-WS默认则为Document/literal Wrapped模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章