如何正確使用不同型別的WSDL檔案
我們在做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的長處是其呼叫帶操作名,訊息分發相對容易。