1. 程式人生 > >如何正確使用不同型別的WSDL檔案

如何正確使用不同型別的WSDL檔案

我們在做SOAP服務的時候,都需要通過WSDL檔案先定義好釋出的服務。WSDL服務的描述,組合起來一共可以有以下4種方式。

  1. RPC/encoded
  2. Document/encoded
  3. RPC/literal
  4. 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的長處是其呼叫帶操作名,訊息分發相對容易。