WSDL檔案詳解
WSDL檔案詳解
對於WSDL的初學者來說,在學習過WSDL的官方文件後,大概有種似懂非懂的感覺。隨便拿一個WSDL,單個元素拆分開來能夠看懂,合起來一整個檔案就看不明白了。今天我就在這裡把自己學習的WSDL做一個總結,同時也希望可以幫助到大家。
一、WSDL簡介
W3school 上的定義:WSDL 指 WSDL 指網路服務描述語言 (Web Services Description Language)。WSDL 是一種使用 XML 編寫的文件。這種文件可描述某個 Web service。它可規定服務的位置,以及此服務提供的操作(或方法)。其中我們可以得知幾點:
1、WSDL是XML文件。
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/POST、MIME 以及 SOAP version 1.1。HTTP 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:tns中APNMResponseType元素中 在此例子中,該名稱空間指向本檔案。即返回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:找出這個porttype中operation中的input指向的message節點 -->
<!-- 4.2:找出這個porttype中operation中的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中的input和output對應的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:找出這個porttype中operation中的input指向的message節點
3.3.:找到message中對應 複雜型別complexType APNMRequest-APNMRequestType sequence 下的元素element為傳入的引數和引數型別
第四步:找出這個服務類中方法的返回值型別
4.1:找出這個方法所在的porttype節點 PAPNManagementPortType
4.2:找出porttype中每一個operation中的input和output對應的message
4.3:找到tyeps節點下name屬性值為APNMResponse的element節點
其返回的型別即為APNMResponseType型別檔案。該檔案的結構在名稱空間xmlns:tns中APNMResponseType元素中 在此例子中,該名稱空間指向本檔案。即返回APNMResponseType中的三個引數,該三個引數包裝在一個物件中,即返回一個物件。
第五步:確定對外提供服務的url地址
這裡的url的第一級目錄和二級目錄會影響我們的配置;
一級目錄影響的是:web.xml中監聽器的匹配規則
二級目錄影響的是:註冊webservice服務的時候指定的名稱