1. 程式人生 > >WSDL檔案詳解

WSDL檔案詳解

WSDL檔案詳解

對於WSDL的初學者來說,在學習過WSDL的官方文件後,大概有種似懂非懂的感覺。隨便拿一個WSDL,單個元素拆分開來能夠看懂,合起來一整個檔案就看不明白了。今天我就在這裡把自己學習的WSDL做一個總結,同時也希望可以幫助到大家。

一、WSDL簡介

W3school 上的定義:WSDL  WSDL 指網路服務描述語言 (Web Services Description Language)WSDL 是一種使用 XML 編寫的文件。這種文件可描述某個 Web service。它可規定服務的位置,以及此服務提供的操作(或方法)。其中我們可以得知幾點:

1、WSDLXML文件。

2、WSDL描述了某個web service 。如何描述的呢?規定了服務的位置和該服務內有哪些方法。

這其實也可以認為是描述了某個介面,並指出了介面的位置,看到這個文件可以呼叫某個介面了。

二、WSDL文件結構

(一)WSDL <portType> 

元素是最重要的 WSDL 元素。它可描述一個 web service、可被執行的操作,以及相關的訊息。可以看作一個模組。

如下:

<wsdl:portType name="PAPNManagementPortType">

<wsdl:operation name="processAPNManagement">

<wsdl:input name="APNMRequest" message="tns:APNMRequest">

</wsdl:input>

<wsdl:output name="APNMResponse" message="tns:APNMResponse">

</wsdl:output>

<wsdl:fault name="FaultMessage" message="tns:FaultMessage">

</wsdl:fault>

</wsdl:operation>

</wsdl:portType>

portType 相當於一個類。

operation 相當於該類裡有一個方法名,方法名為processAPNManagement,該方法裡有一個輸入訊息,一個輸出訊息,一個錯誤訊息。

WSDL 訊息<message> 

元素定義一個操作的資料元素。每個訊息可以傳遞一個或者多個引數。

(二)WSDL types<types> 

元素定義 web service 使用的資料型別。為了最大程度的平臺中立性,WSDL 使用 XML Schema 語法來定義資料型別。即定義了各種引數(請求和返回的各種引數的資料型別定義)。

(三)WSDL Bindings<binding> 

元素為每個埠定義訊息格式和協議細節。

binding 元素有兩個屬性 - name 屬性和 type 屬性。name 屬性定義 binding 的名稱,而 type 屬性指向用於 binding 的埠,在這個例子中是 "tns:PAPNManagementPortType" 埠。

soap:binding 元素有兩個屬性 - style 屬性和 transport 屬性。style 屬性可取值 "rpc" 或 "document"transport 屬性定義了要使用的 SOAP 協議。在這個例子中我們使用 HTTP

style 屬性可取值 "rpc" 或 "document"rpc是遠端過程呼叫約定。使用文件document樣式時,客戶端知道應該使用 XML模式。transport 屬性定義了要使用的 SOAP 協議。WSDL 規範通常描述三種繫結擴充套件:HTTP GET/POSTMIME 以及 SOAP version 1.1HTTP GET/POST 和 MIME 中定義的繫結擴充套件用來定義與標準的 Web 應用程式進行通訊的需

求,這些應用程式可能返回(也可能不返回)XML 文件。在傳送或返回 XML 文件時,HTTP GET/POST 繫結的擴充套件是隱式的文件樣式。

operation 元素定義了每個埠提供的操作符。不管soap:binding元素中的宣告如何,soap:operation元素可以覆蓋每個操作的宣告

對於每個操作,相應的 SOAP 行為都需要被定義。同時您必須如何對輸入和輸出進行編碼。在這個例子中我們使用了 "literal"

三、如何看一個完整的WSDL文件。

首先,WSDL文件最開始應該從下往上看,這一比較容易。

例子:

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

<!--  WSDL 埠型別  -->

<!-- 目標名稱空間 目標名稱空間一定是有效的,其他名稱空間不一定有效。-->

<wsdl:definitions name="PAPNManagementPortType"  

targetNamespace="http://gg.ericsson.com/PAPNManagementPortType/"

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

xmlns:tns="http://gg.ericsson.com/PAPNManagementPortType/"

xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">

<wsdl:types>

<xs:schema attributeFormDefault="unqualified"

elementFormDefault="unqualified"

targetNamespace="http://gg.ericsson.com/PAPNManagementPortType/"

xmlns:tns="http://gg.ericsson.com/PAPNManagementPortType/"

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

<!-- 3.3:找到message中對應 複雜型別complexType  APNMRequest-APNMRequestType sequence 下的元素element為傳入的引數和引數型別--->

<xs:element name="APNMRequest" type="tns:APNMRequest" />

<xs:element name="APNMResponse" type="tns:APNMResponse" />

<xs:element name="FaultMessage" type="tns:FaultMessage" />

<xs:complexType name="APNMRequest">

<xs:sequence>

<xs:element name="Request" type="tns:APNMRequestType" />

</xs:sequence>

</xs:complexType>

<xs:complexType name="APNMRequestType">

<xs:sequence>

<xs:element name="MSISDN" type="xs:string" />

<xs:element name="APN_Type" type="xs:string" />

<xs:element name="Transaction_Type" type="xs:string" />

<xs:element name="Request_ID" type="xs:string" />

<xs:element name="Request_Date_Time" type="xs:string" />

</xs:sequence>

</xs:complexType>

<!-- 4.3:找到tyeps節點下name屬性值為APNMResponse的element節點 

其返回的型別即為APNMResponseType型別檔案。該檔案的結構在名稱空間xmlns:tnsAPNMResponseType元素中  在此例子中,該名稱空間指向本檔案。即返回APNMResponseType中的三個引數,該三個引數包裝在一個物件中,即返回一個物件。-->

<xs:complexType name="APNMResponse">

<xs:sequence>

<xs:element name="Request" type="tns:APNMResponseType" />

</xs:sequence>

</xs:complexType>

<xs:complexType name="APNMResponseType">

<xs:sequence>

<xs:element name="Result_Code" type="xs:string" />

<xs:element name="Result_Date_Time" type="xs:string" />

<xs:element name="Result_Description" type="xs:string" />

</xs:sequence>

</xs:complexType>

<xs:complexType name="FaultMessage">

<xs:sequence>

<xs:element minOccurs="0" name="FaultCode" type="xs:integer" />

<xs:element minOccurs="0" name="FaultMessage" type="xs:string" />

<xs:element minOccurs="0" name="FaultActor" type="xs:string" />

<xs:element minOccurs="0" name="FaultDetail" type="xs:string" />

</xs:sequence>

</xs:complexType>

</xs:schema>

</wsdl:types>

    <!-- 3.2:找出這個porttypeoperation中的input指向的message節點  -->

<!-- 4.2:找出這個porttypeoperation中的output指向的message節點 -->

<wsdl:message name="APNMResponse">

<wsdl:part name="parameters" element="tns:APNMResponse">

</wsdl:part>

</wsdl:message>

<wsdl:message name="FaultMessage">

<wsdl:part name="parameters" element="tns:FaultMessage">

</wsdl:part>

</wsdl:message>

<wsdl:message name="APNMRequest">

<wsdl:part name="parameters" element="tns:APNMRequest">

</wsdl:part>

</wsdl:message>

<!-- 第二步:確定介面中都有哪些方法以及方法的名稱:processAPNManagement   一個operation節點就代表一個方法,也就是在介面中宣告幾個方法。-->

<!-- 第三步:確定介面中方法的引數型別,順序  portType  PAPNManagementPortType 

    假設我要找processAPNManagement方法的引數型別和順序;

   3.1:找出binding節點對應的porttype節點

     根據binding節點為tns:PAPNManagementPortType,找出porttype節點PAPNManagementPortType-->

     <!-- 第四步:找出這個服務類中方法的返回值型別 

    4.1:找出這個方法所在的porttype節點 PAPNManagementPortType  -->

<wsdl:portType name="PAPNManagementPortType">

<!-- 2:找出porttype中每一個operation中的inputoutput對應的message -->

<wsdl:operation name="processAPNManagement">

<wsdl:input name="APNMRequest" message="tns:APNMRequest">

</wsdl:input>

<wsdl:output name="APNMResponse" message="tns:APNMResponse">

</wsdl:output>

<wsdl:fault name="FaultMessage" message="tns:FaultMessage">

</wsdl:fault>

</wsdl:operation>

</wsdl:portType>

<wsdl:binding name="PAPNMServiceSoapBinding"

type="tns:PAPNManagementPortType">

<soap:binding style="document"

transport="http://schemas.xmlsoap.org/soap/http" />

<wsdl:operation name="processAPNManagement">

<soap:operation style="document" />

<wsdl:input>

<soap:body use="literal" />

</wsdl:input>

<wsdl:output>

<soap:body use="literal" />

</wsdl:output>

<wsdl:fault name="FaultMessage">

<soap:fault name="FaultMessage" use="literal" />

</wsdl:fault>

</wsdl:operation>

</wsdl:binding>

<!-- 第一步:確定介面的名稱:ProcessAPNManagementService -->

<wsdl:service name="ProcessAPNManagementService">

<wsdl:port name="ProcessAPNManagementPort" binding="tns:PAPNMServiceSoapBinding">

<!-- 第五步:確定對外提供服務的url地址 

     這裡的url的第一級目錄和二級目錄會影響我們的配置;

             一級目錄影響的是:web.xml中監聽器的匹配規則

             二級目錄影響的是:註冊webservice服務的時候指定的名稱-->

<soap:address

location="http://localhost:8080/LIG_cxf/services/ProcessAPNManagementPort" />

</wsdl:port>

</wsdl:service>

</wsdl:definitions>

第一步:確定介面的名稱:wsdl:service name="ProcessAPNManagementService" 

第二步:確定介面中都有哪些方法以及方法的名稱:processAPNManagement   一個operation節點就代表一個方法,也就是在介面中宣告幾個方法。

第三步:確定介面中方法的引數型別和順序  portType  PAPNManagementPortType 

    假設我要找processAPNManagement方法的引數型別和順序;

   3.1:找出binding節點對應的porttype節點

     根據binding節點為tns:PAPNManagementPortType,找出埠porttype節點PAPNManagementPortType

3.2:找出這個porttypeoperation中的input指向的message節點

3.3.:找到message中對應 複雜型別complexType  APNMRequest-APNMRequestType sequence 下的元素element為傳入的引數和引數型別

第四步:找出這個服務類中方法的返回值型別 

4.1:找出這個方法所在的porttype節點 PAPNManagementPortType 

4.2:找出porttype中每一個operation中的inputoutput對應的message

4.3:找到tyeps節點下name屬性值為APNMResponseelement節點 

其返回的型別即為APNMResponseType型別檔案。該檔案的結構在名稱空間xmlns:tnsAPNMResponseType元素中  在此例子中,該名稱空間指向本檔案。即返回APNMResponseType中的三個引數,該三個引數包裝在一個物件中,即返回一個物件。

第五步:確定對外提供服務的url地址 

     這裡的url的第一級目錄和二級目錄會影響我們的配置;

             一級目錄影響的是:web.xml中監聽器的匹配規則

             二級目錄影響的是:註冊webservice服務的時候指定的名稱