1. 程式人生 > >WSDL在Web Service中的意義和作用

WSDL在Web Service中的意義和作用

1.WSDL

a)原理:從XML-RPCSOAP的使用我們可以看到,請求訊息都是根據服務提供方的服務介面來生成一個HTTP請求,在請求當中封裝所要呼叫的方法,以及方法呼叫時的引數。

客戶端服務呼叫程式碼要完成的任務,也就是使用實現所提供的介面,來宣告呼叫方所需要的方法名及引數,然後由實現根據使用者的輸入來組合HTTP請求。

這個過程可以這樣來描述,首先獲取使用者輸入,然後把輸入變成實現所要求的儲存格式,然後再把該格式變成HTTP請求。一般情況下,我們需要手工完成到第二步,但是,這個過程顯然是可以把他自動化的,自動化的效果就是使用者不再需要書寫這部分的程式碼,減少工作量和降低出錯機率。

自動化的過程就需要WSDL

的參與,他提供了服務方服務的描述,呼叫方根據這個描述,就可以知道服務所需要的引數個數,然後向用戶索取。得到輸入以後,實現可以根據WSDL的要求來把輸入轉換成特定的儲存格式,或者直接生成最後的HTTP請求。

對於每個服務,WSDL需要描述兩部分的內容,一是介面,二是實現。介面描述了服務的格式,例如服務名,服務引數,服務結果。服務實現則描述了,使用者所對應提供的輸入如何轉換成符合某一實現協議的形式,一般情況下,我們使用SOAP作為實現協議,那麼客戶端在分析了WSDL檔案以後,將會把使用者的輸入轉換成我們已經看到過的SOAP請求,之後的過程就與之前的完全一樣。

2.WSDL例項

a)導言部分:指定了下文將要使用的資料型別和訊息型別。

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

<wsdl:definitions name="HelloWorldDescription"

targetNamespace="urn:HelloWorld" xmlns:tns="urn:HelloWorld"

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

<wsdl:message name="sayHello_IN">

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

</wsdl:message>

<wsdl:message name="sayHello_Out">

<part name="greeting" type="xsd:string" />

</wsdl:message>

b)服務介面:描述了方法名,和輸入輸出引數。

<wsdl:portType name="HelloWorldInterface">

<wsdl:operation name="sayHello">

<wsdl:input message="tns:sayHello_IN" />

<wsdl:output message="tns:sayHello_OUT" />

</wsdl:operation>

</wsdl:portType>

c)服務實現:描述了某一個服務介面如何轉換為SOAP請求。

<wsdl:binding name="HelloWorldBinding" type="tns:HelloWorldInterface">

<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

<wsdl:operation name="sayHello">

<soap:operation soapAction="urn:Hello" />

<wsdl:input>

<soap:body use="encoded" namespace="urn:Hello"

encodingStyle=http://schemas.xmlsoap.org/soap/encoding//>

</wsdl:input>

<wsdl:output>

<soap:body use="encoded" namespace="urn:Hello"

encodingStyle=http://schemas.xmlsoap.org/soap/encoding//>

</wsdl:output>

</wsdl:operation>

</wsdl:binding>

d)服務位置:指定了SOAP請求所要傳送的目的地。

<wsdl:service name="HelloWorldService">

<wsdl:port name="HelloWorldPort" binding="tns:HelloWorldBinding">

<soap:address location="http://localhost:8080" />

</wsdl:port>

</wsdl:service>

</wsdl:definitions>