天天看點

wsdl檔案解讀

WSDL 文檔在Web服務的定義中使用下列元素:

  • Types - 資料類型定義的容器,它使用某種類型系統(一般地使用XML Schema中的類型系統)。
  • Message - 通信消息的資料結構的抽象類型化定義。使用Types所定義的類型來定義整個消息的資料結構。
  • Operation - 對服務中所支援的操作的抽象描述,一般單個Operation描述了一個通路入口的請求/響應消息對。
  • PortType - 對于某個通路入口點類型所支援的操作的抽象集合,這些操作可以由一個或多個服務通路點來支援。
  • Binding - 特定端口類型的具體協定和資料格式規範的綁定。
  • Port - 定義為協定/資料格式綁定與具體Web通路位址組合的單個服務通路點。
  • Service - 相關服務通路點的集合。

大家可以參考下圖,來了解一下WSDL文檔的結構組織:

Figure 2. WSDL元素的對象結構示意圖

wsdl檔案解讀

其中,Types是一個資料類型定義的容器,包含了所有在消息定義中需要的XML元素的類型定義,我将在今後的文章中結合XML Schema來詳細說明如何進行類型定義。

Message具體定義了在通信中使用的消息的資料結構,Message元素包含了一組Part元素,每個Part元素都是最終消息的一個組成部分,每個Part都會引用一個DataType來表示它的結構。Part元素不支援嵌套(可以使用DataType來完成這方面的需要),都是并列出現。

PortType具體定義了一種服務通路入口的類型,何謂通路入口的類型呢?就是傳入/傳出消息的模式及其格式。一個PortType可以包含若幹個Operation,而一個Operation則是指通路入口支援的一種類型的調用。在WSDL裡面支援四種通路入口調用的模式:

  1. 單請求;
  2. 單響應;
  3. 請求/響應;
  4. 響應/請求。

在這裡請求指的是從用戶端到Web服務端,而響應指的是從Web服務端到用戶端。PortType的定義中會引用消息定義部分的一個到兩個消息,作為請求或響應消息的格式。比如,一個股票查詢的通路入口可能就會支援兩種請求消息,一種請求消息中指明股票代碼,而另一種請求消息中則會指明股票的名稱,響應消息可能都是股票的價格等等。

以上三種結構描述了調用Web服務的抽象定義,這三部分與具體Web服務部署細節無關,是可複用的描述(每個層次都可以複用)。如果與一般的對象語言做比較的話,這部分可以堪稱是IDL描述的對象,描述了對象的接口标準,但是到底對象是用哪種語言實作,遵從哪種平台的細節規範,被部署在哪台機器上則是後面的元素所描述的。

Service描述的是一個具體的被部署的Web服務所提供的所有通路入口的部署細節,一個Service往往會包含多個服務通路入口,而每個通路入口都會使用一個Port元素來描述。

Port描述的是一個服務通路入口的部署細節,包括通過哪個Web位址(URL)來通路,應當使用怎樣的消息調用模式來通路等。其中消息調用模式則是使用Binding結構來表示。

Binding結構定義了某個PortType與某一種具體的網絡傳輸協定或消息傳輸協定相綁定,從這一層次開始,描述的内容就與具體服務的部署相關了。比如可以将PortType與SOAP/HTTP綁定,也可以将PortType與MIME/SMTP相綁定等。

在介紹了WSDL的主要元素之後,大家會發現,WSDL的設計理念完全繼承了以XML為基礎的當代Web技術标準的一貫設計理念:開放。WSDL允許通過擴充使用其他的類型定義語言(不光是XML Schema),允許使用多種網絡傳輸協定和消息格式(不光是在規範中定義的這些:SOAP/HTTP,HTTP-GET/POST以及MIME等)。同時WSDL也應用了當代軟體工程中的複用理念,分離了抽象定義層和具體部署層,使得抽象定義層的複用性大大增加。比如我們可以先使用抽象定義層為一類Web服務進行抽象定義(比如UDDI Registry,抽象定義肯定是完全一緻的遵循了UDDI規範),而不同的營運公司可以采用不同的具體部署層的描述結合抽象定義完成其自身的Web服務的描述。

wsdl檔案解讀
wsdl檔案解讀
wsdl檔案解讀
wsdl檔案解讀
回頁首

WSDL文檔示例

下例是一個提供股票報價的簡單Web服務的 WSDL 定義。該服務支援名為 GetLastTradePrice 的單一操作,這個操作是通過在 HTTP 上運作 SOAP 1.1 協定來實作的。該請求接受一個類型為字元串的 tickerSymbol,并傳回類型為浮點數的價格。

<?xml version="1.0"?>
<definitions name="StockQuote" 
             targetNamespace="http://example.com/stockquote.wsdl"
             xmlns:tns="http://example.com/stockquote.wsdl"
             xmlns:xsd1="http://example.com/stockquote.xsd"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
             xmlns="http://schemas.xmlsoap.org/wsdl/">
             
 
  <types>
    <schema targetNamespace="http://example.com/stockquote.xsd"
            xmlns="http://www.w3.org/1999/XMLSchema">
      <element name="TradePriceRequest">
        <complexType>
          <all>
            <element name="tickerSymbol" type="string"/>
          </all>
        </complexType>
      </element>
      <element name="TradePriceResult">
        <complexType>
          <all>
            <element name="price" type="float"/>
          </all>
        </complexType>
      </element>
    </schema>
  </types>
      

上面這部分是資料類型的定義,其中為定義了兩個元素的結構:

  • TradePriceRequest(交易價格請求): 将該元素定義為包含一個字元串元素(tickerSymbol)的複合類型元素。
  • TradePriceResult(交易價格): 将該元素定義為一個包含一個浮點數元素(price)的複合類型元素。
<message name="GetLastTradePriceInput">
    <part name="body" element="xsd1:TradePriceRequest"/>
  </message>
 
  <message name="GetLastTradePriceOutput">
    <part name="body" element="xsd1:TradePriceResult"/>
  </message>
      

這部分是消息格式的抽象定義,其中定義了兩個消息格式:

  • GetlastTradePriceInput(擷取最後交易價格的請求消息格式): 由一個消息片斷組成,該消息片斷的名字是body,包含的具體元素類型是TradePriceRequest。(前面已經定義過了)
  • GetLastTradePriceOutput(擷取最後交易價格的響應消息格式) : 由一個消息片斷組成,該消息片斷的名字是body,包含的具體元素類型是TradePriceResult。(前面已經定義過了)
<portType name="StockQuotePortType">
    <operation name="GetLastTradePrice">
      <input message="tns:GetLastTradePriceInput"/>
      <output message="tns:GetLastTradePriceOutput"/>
    </operation>
  </portType>
      

這部分定義了服務通路點的調用模式的類型,表明StockQuoteService的某個入口類型是請求/響應模式,請求消息是GetlastTradePriceInput,而響應消息是GetLastTradePriceOutput。

<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
      <operation name="GetLastTradePrice">
        <soap:operation soapAction="http://example.com/GetLastTradePrice"/>
          <input>
            <soap:body use="literal" namespace="http://example.com/stockquote.xsd"
                       encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
          </input>
          <output>
            <soap:body use="literal" namespace="http://example.com/stockquote.xsd"
                       encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
          </output>
        </soap:operation>
      </operation>
    </soap:binding>
  </binding>
      

這部分将服務通路點的抽象定義與SOAP HTTP綁定,描述如何通過SOAP/HTTP來通路按照前面描述的通路入口點類型部署的通路入口。其中規定了在具體SOAP調用時,應當使用的soapAction是"http://example.com/GetLastTradePrice",而請求/響應消息的編碼風格都應當采用SOAP規範預設定義的編碼風格" http://schemas.xmlsoap.org/soap/encoding/"。

<service name="StockQuoteService">
    <documentation>股票查詢服務</documentation> 
    <port name="StockQuotePort" binding="tns:StockQuoteBinding">
    <soap:address location="http://example.com/stockquote"/>
    </port>
  </service>
 
</definitions>
      

這部分是具體的Web服務的定義,在這個名為StockQuoteService的Web服務中,提供了一個服務通路入口,通路位址是"http://example.com/stockquote",使用的消息模式是由前面的binding所定義的。

按照這個WSDL文檔的描述,在具體Web服務的使用中,具體發生的SOAP互動可能如下面所示:

SOAP消息請求:

POST /StockQuote HTTP/1.1
Host: example.com
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "http://example.com/GetLastTradePrice"

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
    <m:TradePriceRequest xmlns:m="http://example.com/stockquote.xsd">
      <tickerSymbol>MSFT</tickerSymbol >
    </m:TradePriceRequest>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
      

SOAP消息響應:

HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  <SOAP-ENV:Body>
    <m:TradePriceResult xmlns:m=" http://example.com/stockquote.xsd ">
      <price>74.5</price>
    </m:TradePriceResult >
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
      
wsdl檔案解讀
wsdl檔案解讀
wsdl檔案解讀
wsdl檔案解讀
回頁首

小結

在本文中,我簡單介紹了WSDL規範的用途,基本結構和使用方法,在之後,我将就WSDL的元素結構細節進行展開,同時就如何在UDDI Registry中應用WSDL展開讨論。

繼續閱讀