天天看點

WebService Soap消息之style和use

    use屬性可以為literal,encoded;

    style可以為rpc,document.

    我們來對五種類型的style/use決定的 binding作一比較,

    分别是rpc/literal,

             document/literal none-wrapper,

             document/literal with wrapper,

             rpc/encoded, 

             document/encoded。

從生成soap消息的角度看

rpc和document的差别在于方法的操作名是否出現在生成的Soap消息中。

literal和encoded編碼方式的差别在于參數類型是否出現在生成的Soap消息中。

rpc/encoded能夠完整地表示一個方法調用,但性能很差,而且不能校驗Soap消息的有效性。

rpc/literal不對參數類型進行編碼,但仍然無法對Soap消息進行校驗。

document/encoded沒有意義,因為沒有方法名,對參數類型編碼沒有什麼意義。

document/literal none-wrapper無法生成操作名,适用于完整的文檔作為參數傳遞給方法的場景。

document/literal with wrapper應該是目前使用最多的方式。

先看一段Soap消息:

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:jax="http://jaxws.webserver.siyaa.cn/">

   <soapenv:Header/>
   <soapenv:Body>
      <jax:Call>
         <operation>?</operation>
      </jax:Call>
   </soapenv:Body>
</soapenv:Envelope>      

 如果我們隻做一個用戶端去封裝這樣一個saop消息,那麼對于以上五中組合有什麼差別呢?

    抱着這個疑問本人一一測試,最終發現

document/literal none-wrapper
           

   組合的soap消息跟其它的不一樣,其對應消息應該是

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:jax="http://jaxws.webserver.siyaa.cn/">
   <soapenv:Header/>
   <soapenv:Body>
      <jax:Call>
         <jax:operation>?</jax:operation>
      </jax:Call>
   </soapenv:Body>
</soapenv:Envelope>      

    細心的人應該可以發現 請求參數operation前面多了一個字首,若沒有此字首則會找不到參數.

    wsdl中的style 和use 可以很容易的獲得,但是 wrraped 和 bare的是如何區分的呢?

    這個區分不是很明顯,不仔細看是發現不了的:

    wrraped的輸入元素的名稱與操作名稱相同,bare的不同. 另外bare的請求參數隻能有一個.

    就這麼簡單...

    OK,現在可以根據wsdl檔案輕松組裝自己的soap消息了吧,在此記錄可以在以後忘記了快速找到解決方法.也希望給跟我有同樣困惑的人一些提示.