08.13 WebService是如何的?WebService通信機制的理解

WebService是如何的?WebService通信機制的理解

一、SOA和WebService

SOA(service-Oriented Architecture)是面向服務的架構,是一個組件模型,它將應用程序的不同功能單元(稱為服務)通過這些服務之間定義良好的接口和契約聯繫起來。接口是採用中立的方式進行定義的,它應該獨立於實現服務的硬件平臺、操作系統和編程語言。這使得構建在各種各樣的系統中的服務可以使用一種統一和通用的方式進行交互。web service是一個平臺獨立的,低耦合的,自包含的、基於可編程的web的應用程序,可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、發佈、發現、協調和配置這些應用程序,用於開發分佈式的互操作的應用程序。web service是實現SOA架構的一種技術,XML+XSD,SOAP和WSDL就是構成WebService平臺的三大技術。

1、XML+XSD:

XML是WebService平臺中表示數據的格式。 WebService採用HTTP協議傳輸數據,採用XML格式封裝數據(即XML中說明調用遠程服務對象的哪個方法,傳遞的參數是什麼,以及服務對象的返回結果是什麼)除了易於建立和易於分析外,XML主要的優點在於它既是平臺無關的,又是廠商無關的。

XSD(XML Schema)解決了數據數據類型的問題,例如,整形數到底代表什麼?16位,32位,64位?它定義了一套標準的數據類型,並給出了一種語言來擴展這套數據類型。WebService平臺就是用XSD來作為其數據類型系統的。當你用某種語言(如VB.NET或C#)來構造一個Web service時,為了符合WebService標準,所有你使用的數據類型都必須被轉換為XSD類型。

2、SOAP

SOAP即簡單對象訪問協議(Simple Object Access Protocol),它是用於交換XML。WebService通過HTTP協議發送請求和接收結果時,發送的請求內容和結果內容都採用XML格式封裝,並增加了一些特定的HTTP消息頭,以說明HTTP消息的內容格式,這些特定的HTTP消息頭和XML內容格式就是SOAP協議。SOAP提供了標準的RPC方法來調用Web Service。 SOAP協議 = HTTP協議 + XML數據格式。

3、WSDL

WSDL是Web Service描述語言,用於描述Web Service及其函數、參數和返回值。它是WebService客戶端和服務器端都能理解的標準格式。因為是基於XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的,這將是一個很大的好處。一些最新的開發工具既能根據你的Web service生成WSDL文檔,又能導入WSDL文檔,生成調用相應WebService的代理類代碼。WSDL文件保存在Web服務器上,通過一個url地址就可以訪問到它。客戶端要調用一個WebService服務之前,要知道該服務的WSDL文件的地址。WebService服務提供商可以通過兩種方式來暴露它的WSDL文件地址:1.註冊到UDDI服務器,以便被人查找;2.直接告訴給客戶端調用者。

WebService是如何的?WebService通信機制的理解

二、調用webservice的本質

調用一次webservice的本質如下:

1、客戶端把調用方法參數轉換生成XML文檔片段(SOAP消息),且該文檔必須符合WSDL定義的格式;

2、通過http協議把XML文檔片段傳給服務器;

3、服務器接受到XML文檔片段;

4、服務器解析XML文檔片段,提取其中的數據;

5、服務器執行方法;

6、服務器把執行方法得到的返回值轉換成符合WSDL定義的XML文檔片段;

7、通過http協議把XML文檔片段傳輸給客戶端;

8、客戶端接受XML文檔片段;

9、客戶端解析XML文檔,提取其中的數據。

所以從本質上來看,要支持webservice,必須支持XML文檔解析、生成以及支持網絡傳輸。

WebService是如何的?WebService通信機制的理解

三、基於CXF的webservice開發

(1)基本開發流程

1、服務器端

Ⅰ)開發web service業務接口,該接口用@WebService修飾;

Ⅱ)開發web service業務接口的實現類,也要用@WebService修飾;

Ⅲ)使用EndPoint類的靜態方法publish()來發布web service。

2、客戶端

Ⅰ)調用CXF提供的wsdl2java工具,根據WSDL文檔生成相應的Java代碼(任何語言實現web service都要暴露WSDL文檔);

Ⅱ)找到wsdl2java所生成的類中一個繼承了Service的類(該類的實例可當工廠使用);

Ⅲ)調用Service子類的實例的getXXXPort()方法,返回給遠程web service的代理。


分享到:


相關文章: