目前Web服务的相关标准是WSDL【Web服务描述语言】,一种标准的类似XML Schema的语言,用它来详细说明Web服务和SOAP【简单对象访问协议】,Web服务使用的实际的沟通协议就是SOAP。WSDL 绑定样式由两个属性组合而成:style、use;style可以是RPC/Document,use可以是Encoded/Literal;下面解释下这4个名词的意思:
RPC 样式
RPC样式指定<soap:body> 元素包含一个将被调用的web方法的名称的元素(wrapper element(封装元素))。这个元素依次为该方法的每个参数还有返回值作了记录。
Document 样式
如果是document 样式,就没有像在RPC样式中的wrapper元素。转而代之的是消息片断直接出现在<soap:body> 元素之下。没有任何SOAP格式化规则规定<soap:body>元素下能包含什么;它包含的是一个发送者和接收者都达成一致的XML文档。
Encoded 编码
如果use的值是”encoded”, 则每个消息片段将使用类型属性来引用抽象类型。通过应用由 encodingStyle 属性所指定的编码样式,可使用这些抽象类型生成具体的消息。最常用到的SOAP编码样式是在SOAP1.1中定义的一组序列化规则,它说明了对象、结构、数组和图形对象应该如何序列化。通常,在应用程序中使用SOAP编码着重于远程进程调用和以后适合使用RPC消息样式。
Literal 文字?
如果use 的值是”Literal”, 则每个片段使用 element 属性(对于简单片段)或 type 属性(对于复合片段)来引用具体架构,例如,数据根据指定的架构来序列化,这架构通常使用W3C XML架构来表述。
根据不同的组合,形成了四种绑定模型;另外,还有一种用Document模拟RPC样式的包装组合也很常见;
- RPC/Encoded
- RPC/Literal
- Document/Encoded
- Document/Literal
-
Document/Literal Wrapped
对于以上5种组合方式,由于Document/Encoded不被现有平台所支持,在实际中应用很少,所以这里就暂时不讨论该种组合;对于剩下的4种组合,我们结合一个表格和实例来对比下各自的优劣情况;
Binding Type | Advantage/DisAdvantage |
RPC/
Encoded
| 优点:
缺点:
|
RPC/
Literal
| 优点:
缺点:
|
Document/
Litaral
| 优点:
缺点:
|
Document/
Literal
Wrapped
| 优点:
缺点:
|
假设我们需要调用的WS的method为:public void myMethod(int x); 各种绑定样式生成的WSDL/SOAP片段如下:
Binding Type | WSDL | SOAP |
RPC/ Encoded
| <message name="myMethodRequest"> <part name="x" type="xsd:int" /> </message> <message name="empty" /> <portType name="PT"> <operation name="myMethod"> <input message="myMethodRequest" /> <output message="empty" /> </operation> </portType> <binding> <!-- RPC/encoded. --> </binding> | <soap:envelope> <soap:body> <myMethod> <x xsi:type="xsd:int">5</x> </myMethod> </soap:body> </soap:envelope> |
RPC/ Literal
| <message name="myMethodRequest"> <part name="x" type="xsd:int" /> </message> <message name="empty" /> <portType name="PT"> <operation name="myMethod"> <input message="myMethodRequest" /> <output message="empty" /> </operation> </portType> <binding> <!-- RPC/literal. --> </binding> | <soap:envelope> <soap:body> <myMethod> <x>5</x> </myMethod> </soap:body> </soap:envelope> |
Document/ Litaral
|
| <soap:envelope> <soap:body> <xElement>5</xElement> </soap:body> </soap:envelope> |
Document/ Literal Wrapped
|
| <soap:envelope> <soap:body> <myMethod> <x>5</x> </myMethod> </soap:body> </soap:envelope> |