作者:Carlos C. Tapang
Infotects
2001 年 7 月
摘要:只要使用 WSDL,即可以真正不受語言與平台限制的方式,自動為網路服務產生 Proxy。(列印共 28 頁)
內容
使用 WSDL 的原因
WSDL 文件結構
WSDL 範例檔案
命名空間
SOAP 訊息
WSDL 類型與訊息區段中的 XML 結構描述
<portType> 與 <operation> 元素
<binding> 與 <operation> 元素
文件樣式繫結
<service> 與 <port> 元素
總結
資源
使用 WSDL 的原因
網路通訊協定之類的標準,到底是某當權機構強制施行的;或是,人們真的認為,確實遵守的優點遠勝於必須付出的代價?歷來所提出的標準,許多都無疾而終。有時候,從未被大眾所使用的標準,法律或政府規定還是硬要使用:好比說,Ada 程式語言。
我相信,遵守標準所能獲得的優點,才是使標準普及的原因。例如,鐵路服務的重點是,即使不同公司所建造的列車軌道,也可以接駁在一起;也就是說,不同公司的產品必須能整合使用。因此,幾家廠商便共同推出了 SOAP 這個標準。WSDL (Web Services Description Language,網路服務描述語言) 可輕易將網路服務提供廠商與服務的使用者結合起來,輕鬆獲取 SOAP 的優點。不同公司所建造的列車軌道比較容易整合;畢竟,必須同意的標準不過是兩條鐵軌之間的距離而已。但對網路服務而言,情況則複雜得多了。首先必須取得的共識是,指定介面的標準格式。
有個論點一直認為,SOAP 並不需要介面描述語言。若 SOAP 純粹是溝通內容的標準,那麼它需要的便是描述該內容的語言。SOAP 訊息確實可傳遞類型資訊,也因此 SOAP 允許以動態的方式決定類型。但除非知道函數的名稱、參數、與類型,否則根本無法正確呼叫任何函數。若不使用 WSDL,還是可以從所提供的文件或檢查線路訊息,來確定呼叫的語法。但這兩種方式都需要人力介入,也因此可能在過程中出現錯誤。若使用 WSDL,即可以真正不受語言與平台限制的方式,自動為網路服務產生 Proxy。類似 CORBA 或 COM 的 IDL 檔案,WSDL 檔案也是一種客戶端與伺服端之間的合約。
請注意,雖然 WSDL 的設計目的是,對 SOAP 以外的通訊協定顯示繫結;但本文的主旨則是在 HTTP 上與 SOAP 有關連的 WSDL。而且雖然目前 SOAP 的主要用途是遠端程序或函數呼叫,但 WSDL 已經可以在 SOAP 下,指定傳輸的文件。WSDL 1.1 已經以 Note (通知書) 的方式 (請參閱 http://www.w3.org/TR/wsdl.html),提交至 W3C 。
WSDL 文件結構
若欲瞭解任何 XML 文件,區塊圖是很有助益的。下圖說明 WSDL 的結構;它是一種 XML 文件,可顯示 WSDL 文件五個組成區段之間的關係。
WSDL 文件可分成兩個區段群組。上群組是由抽象定義 (Abstract Definitions) 所組成;而下群組則是由具體定義 (Concrete Descriptions) 所組成。抽象區段定義 SOAP 訊息的方式是,排除平台與語言的限制;因此它們不含任何電腦或語言特有的元素。如此一來,不同的網站皆可實作它所定義的服務。諸如序列化等網站特有的資訊,則交由含具體描述的下區段處理。
抽象定義
Types (類型)
不受電腦與語言限制的類型定義。
Messages (訊息)
內含函數參數 (輸入與輸出分離) 或文件描述。
PortTypes (埠類型)
根據 Messages 區段中的訊息定義,說明函數簽章 (作業名稱、輸入參數、輸出參數)。
具體定義
Bindings (繫結)
在 PortTypes 區段中,指定每個作業的繫結。
Services (服務)
指定每個繫結的傳輸埠位址。
在下圖中,箭頭連接代表,在文件的不同區段之間有關聯性存在。點與箭頭連接代表「參照」或「使用」關係。雙箭頭連接代表「修改 (modifier)」關係。3-D 箭頭連接代表「包含 (contains)」關係。因此,Messages 區段使用 Types 區段的定義;PortTypes 區段使用 Messages 區段的定義;Bindings 區段參照 PortTypes 區段;Services 區段參照 Bindings 區段。PortTypes 與 Bindings 區段內含作業元素,而 Services 區段則內含埠元素。Bindings 區段中的作業元素,會修改或進一步說明 PortTypes 區段中的作業元素。
以此為基礎,本文將使用標準 XML 技術,說明 WSDL 文件。「元素」一詞是指 XML 元素,而「屬性」一詞則是指元素屬性。因此:
<element attribute="attribute-value">contents</element>
內容可以遞迴的方式,由一個以上的元素組成。根元素是最頂端的元素,文件中其它所有元素皆歸在其下。子元素永遠附屬於其它的父元素。
請注意,只可以有一個 Types 區段,甚或根本沒有此區段。其它所有區段可以有零、一、或多個父元素。例如,Messages 區段可以有零、或多個 <message> 元素。WSDL 結構描述規定,所有區段必須依指定順序排列:匯入、類型、訊息、portType、繫結、與服務。每個抽象區段可能各自位於不同的檔案,並分別匯入至主文件中。
[圖 1] 抽象與具體定義
WSDL 範例檔案
現在請一同深入探討 WSDL 範例檔案,以檢視其結構與運作方式。請記得這是一個非常簡單的 WSDL 文件範例。其目的僅在解說最明顯的功能。下列各區段皆有更詳實的討論。
<?xml version="1.0" encoding="UTF-8" ?>
<definitions name="FooSample"
targetNamespace="http://tempuri.org/wsdl/"
xmlns:wsdlns="http://tempuri.org/wsdl/"
xmlns:typens="http://tempuri.org/xsd"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:stk="http://schemas.microsoft.com/soap-toolkit/wsdl-extension"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<schema targetNamespace="http://tempuri.org/xsd"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
elementFormDefault="qualified" >
</schema>
</types>
<message name="Simple.foo">
<part name="arg" type="xsd:int"/>
</message>
<message name="Simple.fooResponse">
<part name="result" type="xsd:int"/>
</message>
<portType nam