解讀 WSDL

WSDL文檔能夠分爲兩部分。頂部分由抽象定義組成,而底部分則由具體描述組成。抽象部分以獨立於平臺和語言的方式定義SOAP消息,它們並不包含任何隨機器或語言而變的元素。這就定義了一系列服務,大相徑庭的網站均可以實現。隨網站而異的東西如序列化便納入底部分,由於它包含具體的定義。
l 抽象定義
Types
獨立與機器和語言的類型定義apache

  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元素進一步修改或描述。函數





首先看看一段JAVA代碼生成的WSDL的服務:網站

注:Test 類echo方法String u參數ui

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

    <?xml version="1.0" encoding="UTF-8" ?> 
- <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 created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)

  --> 


定義好操做(或方法)之後,如今須要指定將向它們發送和從它們返回的參數。在 WSDL 術語中,全部參數稱爲「消息」。認爲您是在遞送消息而結果獲得返回的消息是有用的。方法調用是這樣一種操做:它準備返回「消息」來響應進入的消息。



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

- <wsdl:message name="echoResponse">   //返回的消息
  <wsdl:part name="echoReturn" type="xsd:string" /> 
  </wsdl:message>
- <wsdl:message name="echoRequest">  //請求的消息
  <wsdl:part name="u" type="xsd:string" /> 
  </wsdl:message>

<definitions> 元素包含一個或多個 <portType> 元素,實際上,每一個元素都是您但願表示的一系列 operation 。或者,您也能夠將單個 portType 元素看做是將各類方法組成類的一個邏輯分組。例如,若是您的供應鏈管理解決方案須要在客戶和供應商之間進行交互,您最可能作的是分別定義與他們交互的功能性;也就是說,您將爲用戶和供應商各定義一個 portType。應該將每一個 portType 稱爲 服務,所以整個 WSDL 文件將成爲一個服務集合。 

- <wsdl:portType name="Test2">   //一個portType能夠當作一個類
- <wsdl:operation name="echo" parameterOrder="u">   //一個operation就是一個方法
  <wsdl:input name="echoRequest" message="impl:echoRequest" />   //輸入消息
  <wsdl:output name="echoResponse" message="impl:echoResponse" />  //返回消息
  </wsdl:operation>
  </wsdl:portTyp>

 

 消息傳遞和傳輸:
我以一種抽象方式定義了操做和消息,而不考慮實現的細節。實際上,WSDL 的任務是定義或描述 Web 服務,而後提供一個對外部框架的引用來定義 WSDL 用戶將如何實現這些服務。能夠將這個框架看成 WSDL 抽象定義和它們的實現之間的「綁定( binding )」。

spa

當前,最流行的綁定( binding )技術是使用簡單對象訪問協議(SOAP)。WSDL 將指定可以訪問 Web 服務實際實現的 SOAP 服務器,而且從那時起 SOAP 的整個任務就是將用戶從 WSDL 文件帶到它的實現。code

WSDL 編寫的第三個步驟是描述將 SOAP 與 WSDL 文件綁定到一塊兒的過程。您將把 <binding> 元素包括到 <definitions> 元素內。這個 binding 元素應該有 name 和 type 屬性。 name 將標識這個綁定而 type 將標識您但願與這個綁定相關聯的 portType(一組操做)。

      <wsdl:binding name="Test2SoapBinding" type="impl:Test2">

  <wsdlsoap:binding/> 元素。該元素的用途是聲明將把 SOAP 做爲綁定和傳輸服務使用

  <wsdlsoap:binding> 元素有兩個屬性:style 和 transport。style 是一個可選屬性,它描述該綁定內操做的性質。transport 屬性指定 HTTP 做爲該綁定將使用的級別較低的傳輸服務。SOAP 客戶機將從 WSDL 文件中讀取 SOAP 結構並與另外一端的 SOAP 服務器協調.
  <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> 

 WSDL <operation> 元素,分別表示具體的操做。每一個 <operation> 元素提供各自操做的綁定細節。所以,我提供了另外一個 extensibility 元素,即 <wsdlsoap:operation/> (仍然是一個空元素,與它發生的那個操做相關)。該 <soap:operation/> 元素有一個 soapAction 屬性,SOAP 客戶機將使用該屬性建立 SOAP 請求。 

    //下面將WSDL描述與具體實現進行綁定,這裏採用SOAP方式

- <wsdl:operation name="echo">
  <wsdlsoap:operation soapAction="" /> 
- <wsdl:input name="echoRequest">
  <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" /> 
  </wsdl:input>
- <wsdl:output name="echoResponse">
  <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost/axis/Test2.jws" /> 
  </wsdl:output>
  </wsdl:operation>
  </wsdl:binding>
//下面將發佈的服務與前面的SOAP綁定進行關聯
- <wsdl:service name="Test2Service">
- <wsdl:port name="Test2" binding="impl:Test2SoapBinding">
  <wsdlsoap:address location="http://localhost/axis/Test2.jws" /> 
  </wsdl:port>
  </wsdl:service>

每一個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指派。

  targetNamespace屬性聲明瞭一個namespace,元素中全部的聲明的名字都列於其內。在WSDL示例中,<definitions>的targetNamespace 是http://tempuri.org/wsdl。這意味着全部在WSDL文檔中聲明的名字都屬於這個namespace。<schema>元素有本身的targetNamespace屬性,其值爲 http://tempuri.org/xsd ,在<schma>元素中定義的全部名字都屬於這個namespace而不是main的target namespace。xml

  <schema>元素的如下這行聲明瞭默認的namespace。Schema中全部有效的名字都屬於這個namespace。

相關文章
相關標籤/搜索