WebService-WSDL簡單介紹
一、什麽是WSDL
網絡服務描述語言(Web Services Description Language)簡稱WSDL。作用是通過接口之間的調用實現數據的傳輸。由於WSDL是基於XML格式的,所以它可以跨平臺進行調用。WSDL 文檔可以分為兩部分。頂部分由抽象定義組成,而底部分則由具體描述組成。這裏簡單介紹7個主要的元素。
二、7個主要的元素
Types - 數據類型定義的容器,它使用某種類型系統(一般地使用XML Schema中的類型系統)。
Message - 通信消息的數據結構的抽象類型化定義。使用Types所定義的類型來定義整個消息的數據結構。
Operation - 對服務中所支持的操作的抽象描述,一般單個Operation描述了一個訪問入口的請求/響應消息對。
PortType - 對於某個訪問入口點類型所支持的操作的抽象集合,這些操作可以由一個或多個服務訪問點來支持。
Binding - 特定端口類型的具體協議和數據格式規範的綁定。
Port - 定義為協議/數據格式綁定與具體Web訪問地址組合的單個服務訪問點。
Service- 相關服務訪問點的集合。
總結為以下3點:
1. 做什麽? 服務所提供的操作(方法),對應porttype,operation元素。
2. 怎麽做? 數據格式詳情(types,message)及訪問服務操作的必要協議(Binding)。
3. 在哪做?: 由特定協議約定的網絡地址。如URL。 (service,port)。
三、type
數據類型定義的容器,它使用某種類型系統(一般地使用XML Schema中的類型系統)。定義了交換信息的數據格式。 為了實現最大的互操作性(interoperability)和平臺中立性(neutrality),WSDL選用XML Schema DataTypes(簡稱XSD)作為標準類型系統,並將它作為固有類型系統。Element元素定義在消息(message)定義中需要的XML元素的類型定義。complexType 元素定義了XML元素由哪些具體的類型組成以及組成元素的順序。 complexType元素如果放在Types元素下面而又不被element元素包含,那麽它就定義了一個公用的數據類型。可以被多個element元素所引用。否則為私有。
<wsdl:types> <xsd:schema targetNamespace="" xmlns="" xmlns:wsdl="" elementFormDefault="qualified"> <xsd:complexType name="Transaction"> <xsd:sequence> <xsd:element minOccurs="1" maxOccurs="1" name="number" type="xsd:int" /> <xsd:element minOccurs="0" maxOccurs="1" name="checknumber" type="xsd:int" /> <xsd:element minOccurs="1" maxOccurs="1" name="date" type="xsd:date" /> <xsd:element minOccurs="1" maxOccurs="1" name="header" type="xsd:string" /> <xsd:element minOccurs="1" maxOccurs="1" name="amount" type="xsd:float" /> </xsd:sequence> </xsd:complexType> 這是一個復雜類型的定義,這個有點像定義了一個叫做Transaction的類,而這個類有屬性number,checknumber,date,header和amount。這裏定義了一個公用的數據類型結構。 <xsd:element name="LookupTransactionsResponse"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="unbounded" name="transactions" type="xsd1:Transaction" /> </xsd:sequence> </xsd:complexType> </xsd:element> 這裏定義了一個數據類型元素(element)叫做LookupTransactionsResponse,在這裏引用了前面定義的Transaction的集合. 在後面的消息定義中將會引用到這裏所定義的數據類型元素。 <xsd:element name="LookupTransactions"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="1" maxOccurs="1" name="accountNumber" type="xsd:int" /> <xsd:element minOccurs="0" maxOccurs="1" name="date1" type="xsd:date" /> <xsd:element minOccurs="0" maxOccurs="1" name="date2" type="xsd:date" /> <xsd:element minOccurs="1" maxOccurs="1" name="token" type="xsd:base64Binary" /> </xsd:sequence> </xsd:complexType> </xsd:element> 這裏定義的數據類型是一個參數列表,它有accountNumber,date1,date2,token組成。類似於 SomeObject.lookupTransactions(accountNumber,date1,date2,token) 裏面的參數列表。complexType 定義在了element裏面,那麽這個數據類型結構只能是LookupTransactions 私有的了。 </xsd:schema> </wsdl:types>
targetNamespace: 相當於java語言裏的package(包名逆序寫)
minOccurs和maxOccurs,這個屬性用來設置該域在結構中發生的次數上下限。缺省情況下每個字段值發生一次。使 用這些屬性,你可以改變結構體中一個域發生的次數。
四、 Message
Message具體定義了在通信中使用的消息的數據結構。使用Types所定義的類型來定義整個消息的數據結構。定義了調用該接口的時候,soap請求消息的書寫以及調用格式等相關信息。
<wsdl:message name="LookupTransactionsResponse"> <wsdl:part name="parameters" element="xsd1:LookupTransactionsResponse" /> </wsdl:message> 這裏定義了服務在調用之後消息返回的數據格式。其名字為parameters,數據的類型就是xsd1:LookupTransactionsResponse。
<wsdl:message name="LookupTransactions"> <wsdl:part name="parameters" element="xsd1:LookupTransactions" /> </wsdl:message> 這裏定義了訪問服務時需要傳什麽樣的數據。
五、PortType,Operation
PortType - 具體定義了一個服務可以訪問的接口。是對於某個端口類型所支持操作的抽象集合。某個端口(porttype),如soap端口類型,http端口類型。
Operation - 對服務中所支持的操作的抽象描述,一般單個Operation描述了一個訪問入口的請求/響應消息。定義了服務包含的可以被調用的方法個數。
<wsdl:portType name="OnlineBankingPortType"> <wsdl : peration name="LookupTransactions"> <wsdl:input message="tns:LookupTransactions" /> <wsdl : utput message="tns:LookupTransactionsResponse" /> </wsdl : peration> </wsdl:portType>
這裏定義了一個可以訪問的方法LookupTransactions。這個方法的入參,又叫入站消息吧是message裏面定義的tns:LookupTransactions。 同時這個方法還有一個返回對象,又叫出戰消息,是message裏面所定義的tns:LookupTransactionsResponse <wsdl:portType name="ChinaStockWebServiceSoap"> <wsdl :operation name="getStockImageByCode"> <wsdl:documentation xmlns:wsdl=""> sdf </wsdl:documentation> <wsdl:input message="tns:getStockImageByCodeSoapIn" /> <wsdl :output message="tns:getStockImageByCodeSoapOut" /> </wsdl : peration> </wsdl:portType> <wsdl:portType name="ChinaStockWebServiceHttpPost"> <wsdl :operation name="getStockImageByCode"> <wsdl:documentation xmlns:wsdl=""> test </wsdl:documentation> <wsdl:input message="tns:getStockImageByCodeHttpPostIn" /> <wsdl :output message="tns:getStockImageByCodeHttpPostOut" /> </wsdl : peration> </wsdl:portType> // 這裏就定義了兩個端口類型soap和httppost。
Types,Message和PortType抽象地描述了是如何調用webservice的,與具體的web服務部署無關。註意這裏全部用的是wsdl的命名空間。沒有用到soap的命名空間。在後面的綁定和部署就會用到soap消息的命名空間了。
六、Binding
特定端口類型的具體協議和數據格式規範的綁定。binding 元素描述特定服務接口的協議、數據格式、安全性和其它屬性。針對操作和portType中使用的消息指定實際的協議和數據格式規範。
<wsdl:binding name="OnlineBankingPortBinding" type="tns:OnlineBankingPortType"> <soap:binding transport=""/> <wsdl:operation name="LookupTransactions"> <soap:operation soapAction=""/> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding>
前面所定義的端口類型OnlineBankingPortType 綁定在 soap/http協議上面了。這裏用到soap的命名空間進行了綁定。
Soap:binding :指出綁定是針對soap協議格式的。Transport指定了傳輸協議。Style指定通信風格。有“rpc”和“document”兩種風格。
Soap : peration :為SOAP服務操作提供消息。通常可以指明此操作的SOAPActionHTTP頭。Soap:body :指出消息如何在SOAP BODY元素中表現。
<wsdl:binding name="HelloServiceHttpBinding" type="tns:HelloServicePortType"> <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="sayHello"> <wsdlsoap:operation soapAction="" /> <wsdl:input name="sayHelloRequest"> <wsdlsoap:body use="literal" /> </wsdl:input> <wsdl:output name="sayHelloResponse"> <wsdlsoap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding>
type屬性:引用上面的<portType>
<soap:operation style="document" /> 傳輸的是document(xml)
input:指定客戶端應用傳過來的數據,<soap:body use="literal" />:文本數據
output:指定服務器端返回客戶端的數據,<soap:body use="literal" />:文本數據
七、Service,Port
Service- 相關服務訪問點的集合。一個服務所有訪問入口的部署細節。一個Service往往包含多個訪問入口(如URL),每個訪問入口都會使用一個port來描述。Port - 定義為協議/數據格式綁定與具體Web訪問地址組合的單個服務訪問點。由哪個web地址(URL)來訪問,綁定到什麽樣的端口上面。
<wsdl:service name="HelloService"> <wsdl:port name="HelloServiceHttpPort" binding="tns:HelloServiceHttpBinding"> <wsdlsoap:address location="http://localhost:8080/xfire/services/HelloService" /> </wsdl:port> </wsdl:service>
name屬性:它用以指定一個服務器端處理請求的入口(就是接口的實現)
binding屬性:引用上面定義的<binding>
address : 當前webservice的請求地址
Soap:address : 為SOAP服務訪問指定的網絡地址。
下面為多個訪問端口的定義Demo:
<wsdl:service name="ChinaStockWebService"> <wsdl:documentation xmlns:wsdl=""> test </wsdl:documentation> <wsdl:port name="ChinaStockWebServiceSoap" binding="tns:ChinaStockWebServiceSoap"> <soap:address location="" /> </wsdl:port> <wsdl:port name="ChinaStockWebServiceHttpGet" binding="tns:ChinaStockWebServiceHttpGet"> <http:address location="" /> </wsdl:port> </wsdl:service>
至此,簡單介紹完畢!
Soap:binding :指出綁定是針對soap協議格式的。Transport指定了傳輸協議。Style指定通信風格。有“rpc”和“document”兩種風格。
WebService-WSDL簡單介紹