我们在做SOAP服务的时候,都需要通过WSDL文件先定义好发布的服务。WSDL服务的描述,组合起来一共可以有以下4种方式。
- RPC/encoded
- Document/encoded
- RPC/literal
- Document/literal
由于组合总类达到4种之多,有时候我自己也经常搞得挺头疼的。但其实只要抓住以下几个要素,就能够比较容易的区分它们。
首先我谈谈什么是encoded方式。
encoded方式指的是在SOAP调用的XML标签中 (并非指WSDL文件),需要携带有数据类型的信息。比如在SOAP请求调用中有如下信息:
<x xsi:type="xsd:int">5</x>
在这个例子中,xsi:type="xsd:int"指明了x的类型是int的型。这种使用方式会造成SOAP调用时携带的数据过多,降低系统性能。encoded的组合有两张,RPC/encoded和Document/encoded。Document/encoded这种方式也不遵从WS-I标准,RPC/encoded根本没有人使用,所以我们基本上不会再使用带有encoded的方式,它已是一种过时的技术。
那我们接下来看看Document和RPC的区别。
RPC最大的特点是SOAP消息将操作名放入到消息中,Document方式则没有。
<message name="myMethodRequest">
<part name="x" type="xsd:int"/>
<part name="y" type="xsd:float"/>
</message>
<message name="empty"/>
<portType name="PT">
<operation name="myMethod">
<input message="myMethodRequest"/>
<output message="empty"/>
</operation>
</portType>
<soap:envelope>
<soap:body>
<myMethod>
<x>5</x> <y>5.0</y>
</myMethod>
</soap:body>
</soap:envelope>
上面这个例子就是一个RPC的WSDL定义和SOAP调用,myMethod就是操作名。
<types>
<schema>
<element name="xElement" type="xsd:int"/>
<element name="yElement" type="xsd:float"/>
</schema>
</types>
<message name="myMethodRequest">
<part name="x" element="xElement"/>
<part name="y" element="yElement"/>
</message>
<message name="empty"/>
<portType name="PT">
<operation name="myMethod">
<input message="myMethodRequest"/>
<output message="empty"/>
</operation>
</portType>
<soap:envelope>
<soap:body>
<xElement>5</xElement> <yElement>5.0</yElement>
</soap:body>
</soap:envelope>
上面这个例子就是一个Document的定义和SOAP调用。大家可以看到,在这个例子中,SOAP消息没有携带操作名。
RCP的短板就是myMethod 这个标签并没有定义在Schema中,无法做数据验证。但RPC的长处是其调用带操作名,消息分发相对容易。