天天看點

[WS]一個簡單的WSDL文檔(下)

一個WSDL文檔裡一般包含<types>、<message>、<portType>、<binding>和<service>這幾個元素,其中<types>、<message>和<portType>可以看作抽象的接口定義,而<binding>和<service>是具體的實作,注:有些時候也把<binding>看作接口的一部分。你也許看過一些WSDL把這兩部分分開寫在兩個xml檔案裡,并在其中一個檔案裡引入(import)另一個的情況,這也是為什麼要區分接口和實作的原因之一。在現實世界裡,接口部分很可能是由某個組織(例如某行業協會)制定好的,該組織的成員在釋出自己的Web服務時都要引入它,進而達到統一标準的目的。

<types>标簽用來定義Web服務裡用到的,XML Schema定義的資料類型以外的自定義資料類型,對于我們自定義的類(Book),會對應到一個<complexType>,其中用<element>元素指定每個參數的類型。JAX-RPC規範中規定了Java語言的資料類型到XML Schema資料類型的映射,例如int<->xsd:int、java.lang.String<->xsd:string等等,還有數組的映射方式。

<message>标簽定義Web服務裡的消息,最常見的就是請求和響應消息。<message>中可以有<part>元素,它對應Java類中各個方法的參數或傳回值,例如addBook()方法有一個Book類型的參數,則在WSDL中會有<part name="book" type="tns1:Book"/>的描述。

<portType>标簽表示一個服務的類型,就是接口的意思了。WSDL裡有些概念很容易混淆,比如port和service的差別,我把service了解為有一個具體URL的服務,而port代表某一位址,portType是service的抽象,不知道對不對。我們看一個WSDL文檔,一般就該先找<portType>元素,看看這個WSDL代表的Web服務裡都有哪些方法,它們的參數和傳回值是什麼。這些方法是在<portType>裡用<operation>元素表示的,<operation>可以有<input>和<output>子元素,表示方法的輸入和輸出。注意,方法可以是隻有輸入或隻有輸出的。

<binding>元素将portType與具體的傳輸協定綁定。現在,絕大多數都是與SOAP綁定的,對每一個方法的輸入和輸出,都要指定SOAP的表示方法。JAX-RPC規範規定,SOAP綁定可以有rpc和document兩種類型,分别表示遠端過程調用和基于消息的方式。use屬性可以是encoded或literal,對于前者要支援rpc的方式,對于後者要支援rpc和document的方式,它們使得SOAP消息的格式有所差別,但我還沒有仔細研究,你可以參考一下JAX-RPC 1.1版本的6.3-6.4節。又想起另外一個問題,SOAP和HTTP的關系是怎樣的,綁定到SOAP就等于綁定到HTTP了嗎,應該不是,那麼在哪裡指定Web服務綁定的應用層協定(HTTP、SMTP等等)呢?(Update: 由transport屬性指定應用層協定)

最後,<service>元素通過<port>子元素把服務聯系到一個具體的URL,更确切點,應該是把一個已綁定的portType聯系到某個URL,這樣就知道該把SOAP消息發給哪個伺服器了。

我覺得之是以應該花比較多的時間了解WSDL,因為WSDL在整個Web服務中扮演了十分核心的角色,它是對Web服務的一個比較完整的文法上的描述,同時,它還與XML、SOAP以及UDDI都有着非常密切的聯系,是以對于我們更好的認識Web服務體系結構是很重要的。雖然現在的Web服務開發工具都能自動進行Java<->WSDL的轉換,但了解WSDL對于Web服務的不論是設計、開發還是修改調試都是必要的。

參考資料:

<a href="http://www.w3.org/TR/wsdl">Web Services Description Language (WSDL) 1.1</a>

<a href="http://www.cnblogs.com/bjzhanghao/archive/2004/10/09/50216.aspx">使用Axis釋出簡單的Web服務</a>

<a href="http://www.cnblogs.com/bjzhanghao/archive/2004/10/13/51614.aspx">一個簡單的WSDL文檔(上)</a>