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