技術觀念 | Web Service(Web服務)
Web Service
是一種服務導向架構的技術,透過標準的Web
協議提供服務,目的是保證不同平台的應用服務可以互操作。
根據W3C
的定義,Web
服務(Web Service
)應當是一個軟體系統,用以支持網路間不同機器的互動操作。網路服務通常是許多應用程式接口(API
)所組成的,它們透過網路,例如國際網際網路(Internet
)的遠程伺服機端,執行客戶所提交服務的請求。
儘管W3C
的定義涵蓋諸多相異且無法介分的系統,不過通常我們指有關於主從式架構(Client-server
)之間根據SOAP
協議進行傳遞XML
格式消息。無論定義還是實現,Web Service
過程中會由伺服機提供一個機器可讀的描述(通常基於WSDL
)以辨識伺服機所提供的Web Service
。另外,雖然WSDL
不是SOAP
服務端點的必要條件,但目前基於Java
的主流Web Service
開發框架往往需要WSDL
實現客戶端的原始碼生成。一些工業標準化組織,比如WS-I
,就在Web Service
定義中強制包含SOAP
和WSDL
。
更多的「核心定義」、「協議集」,可以參考維基百科-Web服務。
Web Service 到底是什麼?
一言以蔽之:Web Service
是一種跨程式語言和跨作業系統平臺的遠端呼叫技術。
跨程式語言和跨操作平臺:
就是說服務端程式採用java
編寫,客戶端程式則可以採用其他程式語言編寫,反之亦然!跨作業系統平臺則是指服務端程式和客戶端程式可以在不同的作業系統上執行。所謂遠端呼叫:
就是一臺計算機a
上的一個程式可以呼叫到另外一臺計算機b
上的一個物件的方法。
例(1):銀聯提供給商場的POS
刷卡系統,商場的POS
機轉帳調用的轉賬方法的程式碼其實是跑在銀行伺服器上。
例(2):amazon
、天氣預報系統、淘寶網、校內網、百度⋯⋯等把自己的系統服務以Web Service
服務的形式暴露出來,讓第三方網站和程式可以呼叫這些服務功能,這樣擴充套件了自己系統的市場佔有率,往大的概念上吹,就是所謂的SOA
應用。
從多個角度來理解Web Service
,從表面上看,Web Service
就是一個應用程式向外界暴露出一個能通過Web
進行呼叫的API
,也就是說能用程式設計的方法通過Web
來呼叫這個應用程式。我們把呼叫這個Web Service
的應用程式叫做客戶端,而把提供這個Web Service
的應用程式叫做服務端。
從深層次看,Web Service
是建立可互操作的分散式應用程式的新平臺,是一個平臺,是一套標準。它定義了應用程式如何在Web
上實現互操作性,你可以用任何你喜歡的語言,在任何你喜歡的平臺上寫Web service
,只要我們可以通過Web service
標準對這些服務進行查詢和訪問。
Web Service
平臺需要一套協議來實現分散式應用程式的建立。任何平臺都有它的資料表示方法和型別系統。
要實現互操作性,Web Service
平臺必須提供一套標準的型別系統,用於溝通不同平臺、程式語言和元件模型中的不同型別系統。Web service
平臺必須提供一種標準來描述Web service
,讓客戶可以得到足夠的資訊來呼叫這個Web service
。最後,我們還必須有一種方法來對這個Web service
進行遠程呼叫,這種方法實際是一種遠端過程呼叫協議(RPC
)。為了達到互操作性,這種RPC
協議還必須與平臺和程式語言無關。
Web Service 平臺技術
XML XSD
、SOAP
和WSDL
就是構成Web Service
平臺的三大技術。
- XML XSD:
Web Service
採用HTTP
協議傳輸資料,採用XML
格式封裝資料(即XML中說明呼叫遠端服務物件的哪個方法,傳遞的引數是什麼,以及服務物件的返回結果是什麼)。
XML
是Web Service
平臺中表示資料的格式。除了易於建立和易於分析外,XML
主要的優點在於它既是平臺無關的,又是廠商無關
的。無關性是比技術優越性更重要的:軟體廠商是不會選擇一個由競爭對手所發明的技術的。
XML
解決了資料表示的問題,但它沒有定義一套標準的資料型別,更沒有說怎麼去擴充套件這套資料型別。
例如:整形數到底代表什麼?16位
、32位
、64位
?這些細節對實現互操作性很重要。
XML Schema
(XSD
)就是專門解決這個問題的一套標準。它定義了一套標準的資料型別,並給出了一種語言來擴充套件這套資料型別。
Web Service
平臺就是用XSD
來作為其資料型別系統的。當你用某種語言(如VB.NET
或C#
)來構造一個Web service
時,為了符合Web Service
標準,所有你使用的資料型別都必須被轉換為XSD
型別。你用的工具可能已經自動幫你完成了這個轉換,但你很可能會根據你的需要修改一下轉換過程。
- note.xml
1 |
|
- note.xsd
1 |
|
note.xsd
的XML Schema
文件,它定義了上面那個XML
文件的元素。
- SOAP:
Web Service
通過HTTP
協議傳送請求和接收結果時,傳送的請求內容和結果內容都採用XML
格式封裝,並增加了一些特定的HTTP
訊息頭,以說明HTTP
訊息的內容格式,這些特定的HTTP
訊息頭和XML
內容格式就是SOAP
協議。SOAP
提供了標準的RPC
方法來呼叫Web Service
。
SOAP
協議 =HTTP
協議 +XML
資料格式
SOAP
協議定義了SOAP
訊息的格式,SOAP
協議是基於HTTP
協議的,SOAP
也是基於XML
和XSD
的,XML
是SOAP
的資料編碼方式。
比喻:HTTP
就是普通公路,XML
就是中間的綠色隔離帶和兩邊的防護欄,SOAP
就是普通公路經過加隔離帶和防護欄改造過的高速公路。
1 |
|
- WSDL:
好比我們去商店買東西,首先要知道商店裡有什麼東西可買,然後再來購買,商家的做法就是張貼廣告海報。
Web Service
也一樣,Web Service
客戶端要呼叫一個Web Service
服務,首先要有知道這個服務的地址在哪,以及這個服務裡有什麼方
法可以呼叫,所以Web Service
務器端首先要通過一個WSDL
檔案來說明自己家裡有啥服務可以對外呼叫,服務是什麼(服務中有哪些方法,方法接受的引數是什麼,返回值是什麼),服務的網路地址用哪個url
地址表示,服務通過什麼方式來呼叫。
WSDL
(Web Services Description Language
)就是這樣一個基於XML
的語言,用於描述Web Service
及其函式、引數和返回值。它是Web Service
客戶端和伺服器端都能理解的標準格式。因為是基於XML
的,所以WSDL
既是機器可閱讀的,又是人可閱讀的,這將是一個很大的好處。一些最新的開發工具既能根據你的Web service
生成WSDL
文件,又能匯入WSDL
文件,生成呼叫相應Web Service
的代理類程式碼。
1 | <message name="getTermRequest"> |
WSDL
檔案儲存在Web
伺服器上,通過一個url
地址就可以訪問到它。客戶端要呼叫一個Web Service
服務之前,要知道該服務的WSDL
檔案的地址。Web Service
服務提供商可以通過兩種方式來暴露它的WSDL
檔案地址:
1.註冊到UDDI伺服器,以便被人查詢
2.直接告訴給客戶端呼叫者。
Web Service 開發
Web Service
開發可以分為伺服器端開發和客戶端開發兩個方面:
服務端開發:
把公司內部系統的業務方法釋出成Web Service
服務,供遠端合作單位和個人呼叫。
(藉助一些Web Service
框架可以很輕鬆地把自己的業務物件釋出成Web Service
服務,Java
方面的典型Web Service
框架包括:axis
、xfire
,cxf
等,Java EE
伺服器通常也支援釋出Web Service
服務,例如JBoss
。)客戶端開發:
呼叫別人釋出的Web Service
服務,大多數人從事的開發都屬於這個方面,例如:呼叫天氣預報Web Service
服務。
(使用廠商的WSDL2Java
之類的工具生成靜態呼叫的代理類程式碼;使用廠商提供的客戶端程式設計API
類;使用SUN
公司早期標準的jax-rpc
開發包;使用SUN
公司最新標準的jax-ws
開發包。當然SUN
已被ORACLE
收購)
Web Service 工作呼叫原理:
對客戶端而言,我們給這各類Web Service
客戶端API
傳遞WSDL
檔案的url
地址,這些API
就會建立出底層的代理類,我呼叫這些代理,就可以訪問到Web Service
服務。代理類把客戶端的方法呼叫變成SOAP
格式的請求資料再通過HTTP
協議發出去,並把接收到的SOAP
資料變成返回值返回。對服務端而言,各類Web Service
框架的本質就是一個大大的Servlet
,當遠端呼叫客戶端給它通過http
協議傳送過來SOAP
格式的請求資料時,它分析這個資料,就知道要呼叫哪個java
類的哪個方法,於是去查詢或建立這個物件,並呼叫其方法,再把方法返回的結果包裝成SOAP
格式的資料,通過http
響應訊息回給客戶端。
註:以上參考了
維基百科-Web服務
WebService到底是什麼?
Web Services介紹
Web Service 概述