WSDL 快速指南



WSDL - 簡介

WSDL 代表 Web 服務描述語言 (Web Services Description Language)。它是描述 Web 服務的標準格式。WSDL 由微軟和 IBM 聯合開發。

WSDL 的特點

  • WSDL 是一種基於 XML 的協議,用於在分散式和分散式環境中進行資訊交換。

  • WSDL 定義描述瞭如何訪問 Web 服務以及它將執行哪些操作。

  • WSDL 是一種用於描述如何與基於 XML 的服務互動的語言。

  • WSDL 是通用描述、發現和整合 (UDDI) 的組成部分,UDDI 是一個基於 XML 的全球業務註冊中心。

  • UDDI 使用 WSDL 語言。

  • WSDL 讀作“wiz-dull”,拼寫為“W-S-D-L”。

WSDL 的使用

WSDL 通常與 SOAP 和 XML Schema 結合使用,以透過網際網路提供 Web 服務。連線到 Web 服務的客戶端程式可以讀取 WSDL 以確定伺服器上有哪些功能可用。任何使用的特殊資料型別都以 XML Schema 的形式嵌入到 WSDL 檔案中。然後,客戶端可以使用 SOAP 來實際呼叫 WSDL 中列出的函式之一。

WSDL 的歷史

2001 年 3 月,Ariba、IBM 和微軟將 WSDL 1.1 提交給 W3C XML 活動的 XML 協議,作為描述服務的 W3C 說明。

WSDL 1.1 尚未獲得全球資訊網聯盟 (W3C) 的認可,但它剛剛釋出了 2.0 版的草案,該草案將成為推薦標準(正式標準),因此將獲得 W3C 的認可。

WSDL - 元素

WSDL 將 Web 服務分解為三個特定且可識別的元素,這些元素一旦定義就可以組合或重用。

WSDL 的三個主要元素可以分別定義為:

  • 型別
  • 操作
  • 繫結

WSDL 文件包含各種元素,但它們包含在這三個主要元素內,這些元素可以作為單獨的文件開發,然後可以組合或重用以形成完整的 WSDL 檔案。

WSDL 元素

WSDL 文件包含以下元素:

  • 定義 - 它是所有 WSDL 文件的根元素。它定義了 Web 服務的名稱,聲明瞭整個文件中使用的多個名稱空間,幷包含此處描述的所有服務元素。

  • 訊息 - 它是資料的抽象定義,以訊息的形式呈現,可以作為整個文件,也可以作為要對映到方法呼叫的引數。

  • 資料型別 - 用於訊息中的資料型別採用 XML 模式形式。

  • 操作 - 它是訊息操作的抽象定義,例如命名方法、訊息佇列或業務流程,它將接受和處理訊息。

  • 埠型別 - 它是對映到一個或多個端點的操作的抽象集合,定義了繫結的一組操作;作為抽象的操作集合,可以透過各種繫結對映到多個傳輸。

  • 繫結 - 它是為特定埠型別定義的操作和訊息的具體協議和資料格式。

  • - 它是繫結和網路地址的組合,提供了服務通訊的目標地址。

  • 服務 - 它是包含檔案中服務定義的相關端點的集合;服務將繫結對映到埠,幷包含任何可擴充套件性定義。

除了這些主要元素外,WSDL 規範還定義了以下實用程式元素:

  • 文件 - 此元素用於提供人類可讀的文件,可以包含在任何其他 WSDL 元素內。

  • 匯入 - 此元素用於匯入其他 WSDL 文件或 XML 模式。

注意 - WSDL 部分通常使用支援 Web 服務的工具自動生成。

WSDL 文件結構

WSDL 文件的主要結構如下:

<definitions>
   <types>
      definition of types........
   </types>

   <message>
      definition of a message....
   </message>

   <portType>
      <operation>
         definition of a operation.......  
      </operation>
   </portType>

   <binding>
      definition of a binding....
   </binding>

   <service>
      definition of a service....
   </service>
</definitions>

WSDL 文件還可以包含其他元素,例如擴充套件元素和服務元素,使可以在單個 WSDL 文件中組合多個 Web 服務的定義。

繼續分析 WSDL 文件示例。

WSDL - 示例

下面是一個用於演示簡單 WSDL 程式的 WSDL 檔案。

讓我們假設該服務提供單個公開可用的函式,稱為sayHello。此函式期望單個字串引數並返回單個字串問候語。例如,如果您傳遞引數world,則服務函式sayHello將返回問候語“Hello, world!”。

示例

HelloService.wsdl 檔案的內容:

<definitions name = "HelloService"
   targetNamespace = "http://www.examples.com/wsdl/HelloService.wsdl"
   xmlns = "http://schemas.xmlsoap.org/wsdl/"
   xmlns:soap = "http://schemas.xmlsoap.org/wsdl/soap/"
   xmlns:tns = "http://www.examples.com/wsdl/HelloService.wsdl"
   xmlns:xsd = "http://www.w3.org/2001/XMLSchema">
 
   <message name = "SayHelloRequest">
      <part name = "firstName" type = "xsd:string"/>
   </message>
	
   <message name = "SayHelloResponse">
      <part name = "greeting" type = "xsd:string"/>
   </message>

   <portType name = "Hello_PortType">
      <operation name = "sayHello">
         <input message = "tns:SayHelloRequest"/>
         <output message = "tns:SayHelloResponse"/>
      </operation>
   </portType>

   <binding name = "Hello_Binding" type = "tns:Hello_PortType">
      <soap:binding style = "rpc"
         transport = "http://schemas.xmlsoap.org/soap/http"/>
      <operation name = "sayHello">
         <soap:operation soapAction = "sayHello"/>
         <input>
            <soap:body
               encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"
               namespace = "urn:examples:helloservice"
               use = "encoded"/>
         </input>
		
         <output>
            <soap:body
               encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"
               namespace = "urn:examples:helloservice"
               use = "encoded"/>
         </output>
      </operation>
   </binding>

   <service name = "Hello_Service">
      <documentation>WSDL File for HelloService</documentation>
      <port binding = "tns:Hello_Binding" name = "Hello_Port">
         <soap:address
            location = "http://www.examples.com/SayHello/" />
      </port>
   </service>
</definitions>

示例分析

  • 定義 - HelloService

  • 型別 - 使用內建資料型別,並在 XMLSchema 中定義。

  • 訊息 -

    • sayHelloRequest - firstName 引數

    • sayHelloresponse - greeting 返回值

  • 埠型別 - 包含請求和響應服務的 sayHello 操作。

  • 繫結 - 使用 SOAP HTTP 傳輸協議的方向。

  • 服務 - 可在 http://www.examples.com/SayHello/ 訪問的服務。

  • - 將繫結與 URI http://www.examples.com/SayHello/ 關聯,可在該 URI 訪問正在執行的服務。

WSDL - <definition> 元素

<definitions> 元素必須是所有 WSDL 文件的根元素。它定義了 Web 服務的名稱。

這是上一章中使用definitions元素的程式碼片段。

<definitions name="HelloService"
   targetNamespace="http://www.examples.com/wsdl/HelloService.wsdl"
   xmlns="http://schemas.xmlsoap.org/wsdl/"
   xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
   xmlns:tns="http://www.examples.com/wsdl/HelloService.wsdl"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   ................................................
</definitions>

從上面的示例中,我們可以得出結論,definitions

  • 是所有其他元素的容器。

  • 指定此文件稱為HelloService

  • 指定targetNamespace屬性。targetNamespace是 XML Schema 的約定,使 WSDL 文件能夠引用自身。在此示例中,我們指定了targetNamespace為 http://www.examples.com/wsdl/HelloService.wsdl

  • 指定預設名稱空間:xmlns=http://schemas.xmlsoap.org/wsdl/。因此,所有沒有名稱空間字首的元素(例如messageportType)都被認為是預設 WSDL 名稱空間的一部分。

  • 指定整個文件中使用的許多名稱空間。

注意 - 名稱空間規範不需要文件存在於指定位置。重要的是您指定一個唯一的值,該值與定義的所有其他名稱空間不同。

WSDL - <types> 元素

Web 服務需要定義其輸入和輸出以及它們如何對映到服務中和服務之外。WSDL <types> 元素負責定義 Web 服務使用的資料型別。型別是 XML 文件或文件部分。

  • types元素描述了客戶端和伺服器之間使用到的所有資料型別。

  • WSDL 不僅限於特定的型別系統。

  • WSDL 使用 W3C XML Schema 規範作為其定義資料型別的預設選擇。

  • 如果服務僅使用 XML Schema 內建簡單型別(例如字串和整數),則不需要types元素。

  • WSDL 允許在單獨的元素中定義型別,以便可以將型別與多個 Web 服務一起重用。

這是一段從 W3C 規範中獲取的程式碼。這段程式碼描述瞭如何在 WSDL 中使用types元素。

<types>
   <schema targetNamespace = "http://example.com/stockquote.xsd"
      xmlns = "http://www.w3.org/2000/10/XMLSchema">
		
      <element name = "TradePriceRequest">
         <complexType>
            <all>
               <element name = "tickerSymbol" type = "string"/>
            </all>
         </complexType>
      </element>
		
      <element name = "TradePrice">
         <complexType>
            <all>
               <element name = "price" type = "float"/>
            </all>
         </complexType>
      </element>
		
   </schema>
</types>

資料型別解決了標識資料型別和您打算與 Web 服務一起使用的格式的問題。型別資訊在傳送方和接收方之間共享。因此,訊息的接收者需要訪問您用於編碼資料的相關資訊,並且必須瞭解如何解碼資料。

WSDL - <message> 元素

<message> 元素描述了在 Web 服務提供者和使用者之間交換的資料。

  • 每個 Web 服務都有兩條訊息:輸入和輸出。

  • 輸入描述 Web 服務的引數,輸出描述 Web 服務的返回資料。

  • 每條訊息包含零個或多個<part>引數,每個 Web 服務函式的引數各一個。

  • 每個<part>引數都與在<types>容器元素中定義的具體型別相關聯。

讓我們從 WSDL 示例章節中獲取一段程式碼:

<message name = "SayHelloRequest">
   <part name = "firstName" type = "xsd:string"/>
</message>

<message name = "SayHelloResponse">
   <part name = "greeting" type = "xsd:string"/>
</message>

這裡定義了兩個訊息元素。第一個表示請求訊息SayHelloRequest,第二個表示響應訊息SayHelloResponse

這些訊息中的每一個都包含單個部分元素。對於請求,該部分指定函式引數;在本例中,我們指定了單個firstName引數。對於響應,該部分指定函式返回值;在本例中,我們指定了單個問候語返回值。

WSDL - <portType> 元素

<portType> 元素組合多個訊息元素以形成完整的一路或往返操作。

例如,<portType>可以將一個請求訊息和一個響應訊息組合成一個請求/響應操作。這最常用於 SOAP 服務。portType 可以定義多個操作。

讓我們從 WSDL 示例章節中獲取一段程式碼:

<portType name = "Hello_PortType">
   <operation name = "sayHello">
      <input message = "tns:SayHelloRequest"/>
      <output message = "tns:SayHelloResponse"/>
   </operation>
</portType>
  • portType 元素定義了一個名為sayHello的單個操作。

  • 該操作包含單個輸入訊息SayHelloRequest

  • 輸出訊息SayHelloResponse

操作模式

WSDL 支援四種基本操作模式:

單向

服務接收一條訊息。因此,此操作只有一個輸入元素。單向操作的語法為:

<wsdl:definitions .... > 
   <wsdl:portType .... > *
      <wsdl:operation name = "nmtoken">
         <wsdl:input name = "nmtoken"? message = "qname"/>
      </wsdl:operation>
   </wsdl:portType >
</wsdl:definitions>

請求-響應

服務接收一條訊息併發送響應。因此,此操作包含一個輸入元素,後跟一個輸出元素。為了封裝錯誤,還可以指定一個可選的錯誤元素。請求-響應操作的語法為:

<wsdl:definitions .... >
   <wsdl:portType .... > *
      <wsdl:operation name = "nmtoken" parameterOrder = "nmtokens">
         <wsdl:input name = "nmtoken"? message = "qname"/>
         <wsdl:output name = "nmtoken"? message = "qname"/>
         <wsdl:fault name = "nmtoken" message = "qname"/>*
      </wsdl:operation>
   </wsdl:portType>
</wsdl:definitions>

請求-響應

服務傳送一條訊息並接收響應。因此,此操作包含一個輸出元素,後跟一個輸入元素。為了封裝錯誤,還可以指定一個可選的錯誤元素。請求-響應操作的語法為:

<wsdl:definitions .... >
   <wsdl:portType .... > *
      <wsdl:operation name = "nmtoken" parameterOrder = "nmtokens">
         <wsdl:output name = "nmtoken"? message = "qname"/>
         <wsdl:input name = "nmtoken"? message = "qname"/>
         <wsdl:fault name = "nmtoken" message = "qname"/>*
      </wsdl:operation>
   </wsdl:portType >
</wsdl:definitions>

通知

服務傳送一條訊息。因此,此操作只有一個輸出元素。以下是通知操作的語法:

<wsdl:definitions .... >
   <wsdl:portType .... > *
      <wsdl:operation name = "nmtoken">
         <wsdl:output name = "nmtoken"? message = "qname"/>
      </wsdl:operation>
   </wsdl:portType>
</wsdl:definitions>

WSDL - <binding> 元素

<binding> 元素提供有關portType操作如何實際透過網路傳輸的具體細節。

  • 繫結可以透過多種傳輸方式提供,包括HTTP GET、HTTP POST或SOAP。

  • 繫結提供有關用於傳輸portType操作的協議的具體資訊。

  • 繫結提供服務所在位置的資訊。

  • 對於SOAP協議,繫結為<soap:binding>,傳輸方式是基於HTTP協議的SOAP訊息。

  • 您可以為單個portType指定多個繫結。

繫結元素有兩個屬性:name屬性和type屬性。

<binding name = "Hello_Binding" type = "tns:Hello_PortType">

name屬性定義繫結的名稱,type屬性指向繫結的埠,在本例中為“tns:Hello_PortType”埠。

SOAP繫結

WSDL 1.1包含SOAP 1.1的內建擴充套件。它允許您指定SOAP的具體細節,包括SOAP頭、SOAP編碼樣式和SOAPAction HTTP頭。SOAP擴充套件元素包括以下內容:

  • soap:binding
  • soap:operation
  • soap:body

soap:binding

此元素表示繫結將透過SOAP提供。style屬性指示SOAP訊息格式的整體樣式。style值為rpc指定RPC格式。

transport屬性指示SOAP訊息的傳輸方式。值http://schemas.xmlsoap.org/soap/http指示SOAP HTTP傳輸,而http://schemas.xmlsoap.org/soap/smtp指示SOAP SMTP傳輸。

soap:operation

此元素指示將特定操作繫結到特定SOAP實現。soapAction屬性指定使用SOAPAction HTTP頭來標識服務。

soap:body

此元素使您可以指定輸入和輸出訊息的詳細資訊。在HelloWorld的情況下,body元素指定SOAP編碼樣式和與指定服務關聯的名稱空間URN。

以下是示例章節中的程式碼片段:

<binding name = "Hello_Binding" type = "tns:Hello_PortType">
   <soap:binding style = "rpc" transport = "http://schemas.xmlsoap.org/soap/http"/>
   <operation name = "sayHello">
      <soap:operation soapAction = "sayHello"/>
			
      <input>
         <soap:body
            encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"
            namespace = "urn:examples:helloservice" use = "encoded"/>
      </input>
			
      <output>
         <soap:body
            encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"
            namespace = "urn:examples:helloservice" use = "encoded"/>
      </output>
   </operation>
</binding>

WSDL - <ports> 元素

<port> 元素透過為繫結指定單個地址來定義單個端點。

以下是指定埠的語法:

<wsdl:definitions .... >
   <wsdl:service .... > *
      <wsdl:port name = "nmtoken" binding = "qname"> *
         <-- extensibility element (1) -->
      </wsdl:port>
   </wsdl:service>
</wsdl:definitions>
  • port元素有兩個屬性:namebinding

  • name屬性在封閉的WSDL文件中定義的所有埠中提供唯一名稱。

  • binding屬性使用WSDL定義的連結規則引用繫結。

  • 繫結擴充套件性元素用於指定埠的地址資訊。

  • 埠不得指定多個地址。

  • 埠不得指定地址資訊以外的任何繫結資訊。

以下是示例章節中的程式碼片段:

<service name = "Hello_Service">
   <documentation>WSDL File for HelloService</documentation>
   <port binding = "tns:Hello_Binding" name = "Hello_Port">
      <soap:address
         location = "http://www.examples.com/SayHello/">
   </port>
</service>

WSDL - <service> 元素

<service> 元素定義Web服務支援的埠。對於每個支援的協議,都有一個port元素。service元素是埠的集合。

  • Web服務客戶端可以從service元素中瞭解以下資訊:

    • 訪問服務的位置;
    • 透過哪個埠訪問Web服務;以及
    • 如何定義通訊訊息。
  • service元素包含一個documentation元素,用於提供人類可讀的文件。

以下是示例章節中的程式碼片段:

<service name = "Hello_Service">
   <documentation>WSDL File for HelloService</documentation>
   <port binding = "tns:Hello_Binding" name = "Hello_Port">
      <soap:address
         location = "http://www.examples.com/SayHello/">
   </port>
</service>

port元素的繫結屬性將服務的地址與Web服務中定義的繫結元素關聯。在此示例中,這是Hello_Binding

<binding name =" Hello_Binding" type = "tns:Hello_PortType">
   <soap:binding style = "rpc"
      transport = "http://schemas.xmlsoap.org/soap/http"/>
   <operation name = "sayHello">
      <soap:operation soapAction = "sayHello"/>
		
      <input>
         <soap:body
            encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"
            namespace = "urn:examples:helloservice" use = "encoded"/>
      </input>
			
      <output>
         <soap:body
            encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/"
            namespace = "urn:examples:helloservice" use = "encoded"/>
      </output>
   </operation>
</binding>

WSDL - 總結

在本教程中,我們已經介紹了WSDL的基礎知識。下一步是學習SOAP、UDDI和Web服務。

Web服務

Web服務是開放標準(XML、SOAP、HTTP等)的Web應用程式,它們與其他Web應用程式互動以交換資料。

要了解有關Web服務的更多資訊,請訪問Web服務教程。

UDDI

UDDI是用於描述、釋出和查詢Web服務的基於XML的標準。

要了解有關UDDI的更多資訊,請訪問UDDI教程。

SOAP

SOAP是一個簡單的基於XML的協議,允許應用程式透過HTTP交換資訊。

要了解有關SOAP的更多資訊,請訪問SOAP教程。

WSDL - 參考

如果您有興趣將您的公司、網站或書籍列為WSDL資源,請聯絡webmaster@tutorialspoint.com

WSDL規範列表

規範 草案/提案 W3C推薦
     
WSDL 1.1註記

2001年3月15日

 
WSDL使用場景

2002年6月4日

 
WSDL需求

2002年10月28日

 
WSDL架構

2004年2月11日

 
WSDL詞彙表

2004年2月11日

 
WSDL使用場景

2004年2月11日

 
WSDL 1.2核心語言

2003年6月11日

 
WSDL 1.2訊息模式

2003年6月11日

 
WSDL 1.2繫結

2003年6月11日

 
WSDL 2.0入門

2006年3月27日

 
WSDL 2.0核心語言

2006年3月27日

 
WSDL 2.0附加元件

2006年3月27日

 
WSDL 2.0 SOAP 1.1繫結

2006年3月27日

 
WSDL 2.0 RDF對映

2006年5月18日

 
WS定址核心  

2006年5月9日

WS定址SOAP繫結  

2006年5月9日

Web架構  

2004年12月15日

廣告
© . All rights reserved.