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模式。

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