8.1.Webservice原理

2023-07-03 17:23 更新
前面說過,BDF2-WEBSERVICE是基于Spring-WS構(gòu)建,所以如果您了解Spring-WS的開發(fā)流程,那么,一切就很容易實(shí)現(xiàn)。反之,如果您不了解Spring-WS或不太理解Webservice的運(yùn)行原理,那我們建議您先去了解一下。這里在開始開發(fā)一個(gè)Webservice之前,我們建議您去w3school上學(xué)習(xí)一下XSD語法及WSDL語法,熟悉這兩種類型的XML對于我們開發(fā)基于Spring-WS的Webservice來說是必須的,同時(shí)它也會(huì)幫助我們理解Webservice的整個(gè)運(yùn)行原理,總之有百利而無一害。不要害怕學(xué)習(xí),w3school上關(guān)于這兩種類型XML的教程寫的非常好,也非常簡單,先去學(xué)習(xí)一下吧。

從零開始學(xué)習(xí)Webservice開發(fā)并不是BDF2-WEBSERVICE的責(zé)任,但這里我們也會(huì)簡單介紹一下Webservice運(yùn)行原理,要想更為深入的學(xué)習(xí)Webservice,大家還需要去好好研究它的規(guī)范才行。


我們知道,Webservice主要特點(diǎn)是跨平臺(tái),也就是我們通過JAVA暴露的Webservice可能通過Java的客戶端調(diào)用,也可以通過.net或php的客戶端調(diào)用,反之亦然。應(yīng)該說,這一點(diǎn)是吸引我們使用Webservice最重要的原因,那它是怎么實(shí)現(xiàn)這種跨平臺(tái)調(diào)用的呢?

Webservice規(guī)則通過傳輸固定格式的XML來解決跨平臺(tái)調(diào)用問題,那就是在用戶請求目標(biāo)Webservice時(shí),需要將請求的內(nèi)容包裝成一個(gè)特定的XML格式:SOAP,也就是簡單對象訪問協(xié)議,這是一個(gè)特定基于XML格式的消息協(xié)議。調(diào)用客戶端將消息封裝成SOAP格式的XML,通過標(biāo)準(zhǔn)的HTTP協(xié)議向目標(biāo)Webservice發(fā)送一個(gè)標(biāo)準(zhǔn)的post請求,請求的內(nèi)容就是這個(gè)封裝好的SOAP格式的XML消息。Webservice服務(wù)端在收到這個(gè)客戶端提交上來的POST請求之后,會(huì)將請求的XML內(nèi)容以一個(gè)SOAP格式進(jìn)行解析,在解析并獲取到客戶端請求的SOAP格式的XML消息之后,接下來,Webservice服務(wù)端需要知道服務(wù)端的哪個(gè)類哪個(gè)方法可以接受并響應(yīng)這個(gè)請求。

一般來說,Webservice服務(wù)端有兩種方式用于匹配具體的用于響應(yīng)Webservice服務(wù)的類及方法:一個(gè)是根據(jù)請求的SOAP消息的XML的root的節(jié)點(diǎn)名稱及其采用的namespace;一個(gè)是根據(jù)從SOAP消息的header中取出的SOAPAction的值(對于Spring-WS來說,這兩種方法都支持),一旦找到了匹配的響應(yīng)Webservice服務(wù)的類及方法,那么它會(huì)檢查這個(gè)服務(wù)是否需要基于WS-Security的認(rèn)證,如果需要,那么它會(huì)嘗試從這個(gè)SOAP的header中獲取相關(guān)認(rèn)證信息,在通過認(rèn)證之后,按照匹配的響應(yīng)Webservice服務(wù)的類及方法的要求,將SOAP格式的XML消息的body部分解析成相應(yīng)的參數(shù)對象,交由匹配的響應(yīng)Webservice服務(wù)的類及方法去執(zhí)行處理。方法處理完成之后,如果有響應(yīng),那么Webservice服務(wù)端會(huì)將響應(yīng)的結(jié)果反序列化成一個(gè)標(biāo)準(zhǔn)的SOAP格式的XML,再這個(gè)XML回寫到客戶端,客戶端再對取到的SOAP格式的響應(yīng)結(jié)果進(jìn)行解析,從而完成整個(gè)Webservice調(diào)用。

可以看到,Webservice服務(wù)的請求與響應(yīng)的內(nèi)容皆以XML格式為載體,我們知道XML是一種跨平臺(tái)的消息傳遞格式,所有平臺(tái)都可以對其進(jìn)行解析、處理,所以Webservice也就可以進(jìn)行跨平臺(tái)調(diào)用。到目前為止,我們還沒有涉及到WSDL,實(shí)際上Webservice服務(wù)本身與WSDL并無關(guān)系,WSDL的全稱是Webservice描述語言,也就是說WSDL是用來描述目標(biāo)Webservice是什么樣的,用來告訴我們的客戶該怎么調(diào)用這個(gè)Webservice的。所以我們完全可以把WSDL理解成是某個(gè)Webservice服務(wù)的說明文檔或者是幫助文檔,沒有這個(gè)WSDL,我們的Webservice服務(wù)照樣可以正常運(yùn)行,也就是說WSDL存在與否不會(huì)對Webservice服務(wù)產(chǎn)生任何影響。但對于我們程序員來說,暴露的Webservice是給我們調(diào)用的,所以我們必須學(xué)會(huì)看懂WSDL,不然就不知道如何調(diào)用目標(biāo)Webservice,這也是我們開篇強(qiáng)調(diào)學(xué)習(xí)WSDL的重要原因。

開篇除了強(qiáng)調(diào)學(xué)習(xí)WSDL之外,我們還強(qiáng)調(diào)學(xué)習(xí)XSD,其實(shí)對于標(biāo)準(zhǔn)的Webservice而言是不需要了解XSD的,但我們這里強(qiáng)調(diào)學(xué)習(xí)XSD的原因是其可以幫助我們編寫WSDL文件。了解了WSDL之后,會(huì)發(fā)現(xiàn)其語法較為復(fù)雜,手工編寫起來難度很大,所以Spring-WS為我們提供了另外一種選擇,那就是通過編寫XSD來代替WSDL,Spring-WS會(huì)幫我們將XSD動(dòng)態(tài)轉(zhuǎn)換成WSDL,相比WSDL,編寫XSD要簡單許多。
Webservice開發(fā)有兩種模式:一種稱之為contract-first;另一種是contract-last。關(guān)于這兩種模式的優(yōu)劣,Spring-WS官方文檔作了大篇幅的討論,感興趣可以去看看,這里就不再贅述了。Spring-WS采用的是contract-first模式,相比contract-last有眾多優(yōu)勢,具體大家可以看到Spring-WS官方文檔。

對于Spring-WS來說,基于contract-first模式開發(fā)Webservice首先要做的第一件事就是確定我們的WSDL,也就是把要把編寫的目標(biāo)Webservice描述清楚:其中包含請求當(dāng)中應(yīng)該包含哪些信息、響應(yīng)當(dāng)中應(yīng)該包含哪些信息、應(yīng)該采用什么樣的namespace等。所以這里的WSDL相當(dāng)于我們軟件開發(fā)當(dāng)中的需求文檔,把需求文檔寫清楚了,程序員才知道如何編寫具體的業(yè)務(wù)代碼,只是這里的需求文檔是WSDL,是一個(gè)XML文件,除此之外,它與需求文檔的在本質(zhì)完全相同。

例子是最好的教程,接下來我們就來編寫一個(gè)Webservice,并用SOAPUI來測試其是否可使用,按照Spring-WS的contract-first模式,我們首先來編寫一個(gè)用于描述Webservice內(nèi)容的WSDL,這里其實(shí)就是編寫一個(gè)XSD文件。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號