天天看點

WSDL 規則解釋

WSDL文檔可以分為兩部分。頂部分由抽象定義組成,而底部分則由具體描述組成。抽象部分以獨立于平台和語言的方式定義SOAP消息,它們并不包含任何随機器或語言而變的元素。這就定義了一系列服務,截然不同的網站都可以實作。随網站而異的東西如序列化便歸入底部分,因為它包含具體的定義。

l 抽象定義

        Types

            獨立與機器和語言的類型定義

  Messages

           包括函數參數(輸入與輸出分開)或文檔描述

  PortTypes

           引用消息部分中消息定義來描述函數簽名(操作名、輸入參數、輸出參數)

2 具體定義

        Bindings

       PortTypes部分的每一操作在此綁定實作

  Services

          确定每一綁定的端口位址

下面的圖中,箭頭連接配接符代表文檔不同欄之間的關系。點和箭頭代表了引用或使用關系。雙箭頭代表"修改"關系。3-D的箭頭代表了包含關系。這樣,各Messages欄使用Types欄的定義,PortTypes欄使用Messages欄的定義;Bindings欄引用了PortTypes欄,Services欄引用Bindings欄,PortTypes和Bindings欄包含了operation元素,而Services欄包含了port元素。PortTypes欄裡的operation元素由Bindings欄裡的operation元素進一步修改或描述。

WSDL 規則解釋

首先看看一段簡單的JAVA代碼,我們用它作為WSDL的服務實作代碼:

WSDL 規則解釋
WSDL 規則解釋

public class Test

WSDL 規則解釋

{

WSDL 規則解釋
WSDL 規則解釋

  public String echo(String u)

WSDL 規則解釋
WSDL 規則解釋

    return "Hello " + u;

WSDL 規則解釋

  }

WSDL 規則解釋

}

WSDL 規則解釋

看看它導出的檔案:

WSDL 規則解釋

  //第一行申明該文檔是XML。盡管這并不是必需的,但它有助于XML解析器決定是否解析WSDL檔案或隻是報錯。第二行是WSDL文檔的根元素:<definitions>。一些屬性附屬于根元素,就像<schema>子元素對于<types>元素。

    <?xml version="1.0" encoding="UTF-8" ?> 

WSDL 規則解釋

- <wsdl:definitions targetNamespace="http://localhost/axis/Test2.jws"

                                      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 

                                      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 

                                      xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 

                                      xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"

                                      xmlns:apachesoap="http://xml.apache.org/xml-soap" 

                                      xmlns:intf="http://localhost/axis/Test2.jws" 

                                      xmlns:impl="http://localhost/axis/Test2.jws">

WSDL 規則解釋

- <!-- 

WSDL 規則解釋

WSDL created by Apache Axis version: 1.4

WSDL 規則解釋

Built on Apr 22, 2006 (06:55:48 PDT)

WSDL 規則解釋
WSDL 規則解釋

  --> 

定義好操作(或方法)以後,現在需要指定将向它們發送和從它們傳回的參數。在 WSDL 術語中,所有參數稱為“消息”。認為您是在遞送消息而結果得到傳回的消息是有用的。方法調用是這樣一種操作:它準備傳回“消息”來響應進入的消息。

<message>元素包含了Messages欄。如果我們把操作看作函數,<message>元素定義了那個函數的參數。<message>元素中的每個<part>子元素都和某個參數相符。輸入參數在<message>元素中定義,與輸出參數相隔離--輸出參數有自己的<message>元素。兼作輸入、輸出的參數在輸入輸出的<message>元素中有它們相應的<part>元素。輸出<message>元素以"Response"結尾,就像以前所用的"fooResponse"。每個<part>元素都有名字和類型屬性,就像函數的參數有參數名和參數類型。

WSDL 規則解釋

- <wsdl:message name="echoResponse">  

//傳回的消息

WSDL 規則解釋

  <wsdl:part name="echoReturn" type="xsd:string" /> 

WSDL 規則解釋

  </wsdl:message>

WSDL 規則解釋

- <wsdl:message name="echoRequest">  //請求的消息

WSDL 規則解釋

  <wsdl:part name="u" type="xsd:string" /> 

WSDL 規則解釋

&lt;definitions&gt; 元素包含一個或多個 <code>&lt;portType&gt;</code> 元素,實際上,每個元素都是您希望表示的一系列

<code>operation</code> 。或者,您也可以将單個 portType 元素看作是将各種方法組成類的一個邏輯分組。例如,如果您的供應鍊管了解決方案需要在客戶和供應商之間進行互動,您最可能做的是分别定義與他們互動的功能性;也就是說,您将為使用者和供應商各定義一個 portType。應該将每個 portType 稱為

服務,是以整個 WSDL 檔案将成為一個服務集合。

WSDL 規則解釋

- &lt;wsdl:portType name="Test2"&gt;  

//一個portType可以看成一個類

WSDL 規則解釋

- &lt;wsdl:operation name="echo" parameterOrder="u"&gt;  

//一個operation就是一個方法

WSDL 規則解釋

  &lt;wsdl:input name="echoRequest" message="impl:echoRequest" /&gt;  

//輸入消息

WSDL 規則解釋

  &lt;wsdl:output name="echoResponse" message="impl:echoResponse" /&gt; 

//傳回消息

WSDL 規則解釋

  &lt;/wsdl:operation&gt;

WSDL 規則解釋

  &lt;/wsdl:portTyp&gt;

消息傳遞和傳輸:

我以一種抽象方式定義了操作和消息,而不考慮實作的細節。實際上,WSDL 的任務是定義或描述 Web 服務,然後提供一個對外部架構的引用來定義 WSDL 使用者将如何實作這些服務。可以将這個架構當作 WSDL 抽象定義和它們的實作之間的“綁定(

<code>binding</code> )”。

目前,最流行的綁定( <code>binding</code> )技術是使用簡單對象通路協定(SOAP)。WSDL 将指定能夠通路 Web 服務實際實作的 SOAP 伺服器,并且從那時起 SOAP 的整個任務就是将使用者從 WSDL 檔案帶到它的實作。

WSDL 編寫的第三個步驟是描述将 SOAP 與 WSDL 檔案綁定到一起的過程。您将把 <code>&lt;binding&gt;</code> 元素包括到

<code>&lt;definitions&gt;</code> 元素内。這個 binding 元素應該有 <code>name</code> 和 <code>type</code> 屬性。

<code>name</code> 将辨別這個綁定而 <code>type</code> 将辨別您希望與這個綁定相關聯的 portType(一組操作)。

      &lt;wsdl:binding name="Test2SoapBinding" type="impl:Test2"&gt;

WSDL 規則解釋

  &lt;wsdlsoap:binding/&gt; 元素。該元素的用途是聲明将把 SOAP 作為綁定和傳輸服務使用

<code>  &lt;wsdlsoap:binding&gt;</code> 元素有兩個屬性:style 和 transport。style 是一個可選屬性,它描述該綁定内操作的性質。transport 屬性指定 HTTP 作為該綁定将使用的級别較低的傳輸服務。SOAP 客戶機将從 WSDL 檔案中讀取 SOAP 結構并與另一端的 SOAP 伺服器協調.

WSDL 規則解釋

  &lt;wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /&gt; 

WSDL 規則解釋

 WSDL <code>&lt;operation&gt;</code> 元素,分别表示具體的操作。每個 <code>&lt;operation&gt;</code> 元素提供各自操作的綁定細節。是以,我提供了另一個

<code>extensibility</code> 元素,即 <code>&lt;wsdlsoap:operation/&gt;</code> (仍然是一個空元素,與它發生的那個操作相關)。該

<code>&lt;soap:operation/&gt;</code> 元素有一個 soapAction 屬性,SOAP 客戶機将使用該屬性建立 SOAP 請求。

WSDL 規則解釋

    //下面将WSDL描述與具體實作進行綁定,這裡采用SOAP方式

WSDL 規則解釋

- &lt;wsdl:operation name="echo"&gt;

WSDL 規則解釋

  &lt;wsdlsoap:operation soapAction="" /&gt; 

WSDL 規則解釋

- &lt;wsdl:input name="echoRequest"&gt;

WSDL 規則解釋

  &lt;wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" /&gt; 

WSDL 規則解釋

  &lt;/wsdl:input&gt;

WSDL 規則解釋

- &lt;wsdl:output name="echoResponse"&gt;

WSDL 規則解釋

  &lt;wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost/axis/Test2.jws" /&gt; 

WSDL 規則解釋

  &lt;/wsdl:output&gt;

WSDL 規則解釋
WSDL 規則解釋

  &lt;/wsdl:binding&gt;

WSDL 規則解釋

//下面将釋出的服務與前面的SOAP綁定進行關聯

WSDL 規則解釋

- &lt;wsdl:service name="Test2Service"&gt;

WSDL 規則解釋

- &lt;wsdl:port name="Test2" binding="impl:Test2SoapBinding"&gt;

WSDL 規則解釋

  &lt;wsdlsoap:address location="http://localhost/axis/Test2.jws" /&gt; 

WSDL 規則解釋

  &lt;/wsdl:port&gt;

WSDL 規則解釋

  &lt;/wsdl:service&gt;

 每個namespace屬性都聲明了一個縮略語,用在文檔中。例如"xmlns:xsd"就為 http://www.w3.org/2001/XMLSchema定義了一個縮略語(xsd)。這就允許對該namespace的引用隻需簡單的在名字前加上字首就可以了,如:"xsd:int"中的"xsd"就是合法的類型名。普通範圍規則可運用于縮略字首。也就是說,字首所定義的元素隻在元素中有效。

  Namespace派什麼用?namespace的作用是要避免命名沖突。如果我建立一項Web Service,其中的WSDL檔案包含一個名為"foo"的元素,而你想要使用我的服務與另一項服務連接配接作為補充,這樣的話另一項服務的WSDL檔案就不能包含名為"foo"的元素。兩個伺服器程式隻有在它們在兩個事例中表示完全相同的東西時,才可以取相同的名字。如果有了表示差別的namespace,我的網絡服務裡的"foo"就可以表示完全不同于另一個網絡服務裡"foo"的含義。在你的用戶端裡,你隻要加以限制就可以引用我的"foo"。

  見下例:http://www.infotects.com/fooService#foo 就是完全限制的名字,相當于"carlos:foo",如果我聲明了carlos作為http://www.infotects.com/fooService的快捷方式。請注意namespace中的URL是用來确定它們的唯一性的,同時也便于定位。URL所指向的地方不必是實際存在的網絡位址,也可以使用GUID來代替或補充URL。例如,GUID"335DB901-D44A-11D4-A96E-0080AD76435D"就是一個合法的namespace指派。

  &lt;schema&gt;元素的以下這行聲明了預設的namespace。Schema中所有有效的名字都屬于這個namespace。