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:encoded
和literal
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模式。