昨天有了第一篇博客後,感受本身必須堅持下去,因此今天就根據工做需求,來系統的去學習一些跟工做有關係的東西!首先是webservice。web
那麼什麼是webservice呢?那麼下面我就用博客記錄一下我學習的過程!個人學習思路以下:
編程
1.它是個什麼玩意?
瀏覽器
2.它基本怎麼使用?
安全
3.它還能怎麼使用?
服務器
4.來把它拆開看看裏面是個什麼玩兒?網絡
--------------------------------------------------------------------------------------------------------------------app
webservice之簡介:
編程語言
webservice:是一個平臺獨立的,低耦合的,自包含的、基於可編程的web的應用程序。再說的簡單明瞭一點就是它是一種跨編程語言和跨操做系統的遠程調用技術。分佈式
webservice優點和劣勢:在早期的WebService開發中,因爲帶寬與存儲容量的限制,令它並不被人關注。隨着技術的發展,帶寬與存儲已經不成任何問題了,隨便一條光纖就有1000M,家庭用的計算機都有160GB,更不要說服務器用的動輒就上TB的磁盤陣列了。然而,隨着Internet的飛速發展,人們都應該感受到網絡給人們帶來的新驚喜了,那就是網上辦公。如今的網上辦公系統是越作越先進,可是有一個通病——兼容性問題,所以溝通十分的困難,然而WebService則讓人的溝通更加順暢。打個比方:兩國的人交流須要翻譯,十分麻煩,所以不如統一兩國的語言。而WebService就是這樣的一個新的概念。WebService的發展時間很短,所以致使了一個問題——安全性。因爲XML傳輸所有是明文傳輸,所以致使了安全性問題也不奇怪,但只需在要傳輸的數據上作點手腳就解決了。
分佈式應用程序和瀏覽器
研究一下當前的應用程序開發,你會發現一個絕對的傾向:人們開始偏心基於瀏覽器的瘦客戶應用程序。這固然不是由於瘦客戶可以提供更好的用戶界面,而是由於它可以避免花在桌面應用程序發佈上的高成本。發佈桌面應用程序成本很高,一半是由於應用程序安裝和配置的問題,另外一半是由於客戶和服務器之間通訊的問題。
傳統的Windows富客戶應用程序使用DCOM來與服務器進行通訊和調用遠程對象。配置好DCOM使其在一個大型的網絡中正常工做將是一個極富挑戰性的工做,同時也是許多IT工程師的噩夢。事實上,許多IT工程師寧願忍受瀏覽器所帶來的功能限制,也不肯在局域網上去運行一個DCOM。在我看來,結果就是一個發佈容易,但開發難度大並且用戶界面極其受限的應用程序。極端的說,就是你花了更多的資金和時間,卻開發出從用戶看來功能更弱的應用程序。不信?問問你的會計師對新的基於瀏覽器的會計軟件有什麼想法:絕大多數商用程序用戶但願使用更加友好的Windows用戶界面。
關於客戶端與服務器的通訊問題,一個完美的解決方法是使用HTTP協議來通訊。這是由於任何運行Web瀏覽器的機器都在使用HTTP協議。同時,當前許多防火牆也配置爲只容許HTTP鏈接。
許多商用程序還面臨另外一個問題,那就是與其餘程序的互操做性。若是全部的應用程序都是使用COM或.NET語言寫的,而且都運行在Windows平臺上,那就天下太平了。然而,事實上大多數商業數據仍然在大型主機上以非關係文件(VSAM)的形式存放,並由COBOL語言編寫的大型機程序訪問。並且,目前還有不少商用程序繼續在使用C++、Java、Visual Basic和其餘各類各樣的語言編寫。如今,除了最簡單的程序以外,全部的應用程序都須要與運行在其餘異構平臺上的應用程序集成並進行數據交換。這樣的任務一般都是由特殊的方法,如文件傳輸和分析,消息隊列,還有僅適用於某些狀況的的API,如IBM的"高級程序到程序交流(APPC)"等來完成的。在之前,沒有一個應用程序通訊標準,是獨立於平臺、組建模型和編程語言的。只有經過Web Service,客戶端和服務器纔可以自由的用HTTP進行通訊,不論兩個程序的平臺和編程語言是什麼。(這裏是摘抄的部分)說白了,它的優勢就是能夠跨平臺和跨語言調用,缺點就是數據傳輸中的安全問題,不過這個能夠加密,也不算很大的問題!函數
webservice的組成:
在學習中我看了一些網上的介紹,大部分都是說Web Service = SOAP + HTTP + WSDL。
其中soap(simple object access protocol)協議是webservice的主體,他經過HTTP或者SMTP等應用層協議進行通信,自身經過xml文件來描述程序的函數和參數信息,從而完成不一樣語言和不一樣操做系統之間的計算處理。這裏的WSDL(web service description language) web服務描述語言也是一個xml文檔,他經過通信協議向外發佈。
SOAP協議介紹:
soap協議指的是簡單的對象訪問協議,它是一種基於xml的消息通信格式,用於不一樣語言,不一樣操做系統的應用程序間的通信。由於他是基於xml,因此它有可自定義和可擴展的屬性。so 一條soap消息就包含如下元素:
Envelope 元素,標識XML 文檔一條 SOAP 消息
Header 元素,包含頭部信息的XML標籤
Body 元素,包含全部的調用和響應的主體信息的標籤
Fault 元素,錯誤信息標籤。
以上的元素都在 SOAP的命名空間http://www.w3.org/2001/12/soap-envelope中聲明;
SOAP的語法規則
SOAP 消息必須用 XML 來編碼
SOAP 消息必須使用 SOAP Envelope 命名空間
SOAP 消息必須使用 SOAP Encoding 命名空間
SOAP 消息不能包含 DTD 引用
SOAP 消息不能包含 XML 處理指令
SOAP 消息的基本結構
<? xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.yqnianc.com/2001/12/soap-encoding"> <soap:Header> ... </soap:Header> <soap:Body> ... <soap:Fault> ... </soap:Fault> </soap:Body> </soap:Envelope>
SOAP Envelope 元素
Envelope 元素是 SOAP 消息的根元素。它指明 XML 文檔是一個SOAP 消息。它的屬性 xmlns:soap的值必須是http://www.w3.org/2001/12/soap-envelope。
encodingStyle 屬性,語法:soap:encodingStyle="URI"
encodingStyle 屬性用於定義文檔中使用的數據類型。此屬性可出如今任何 SOAP 元素中,並會被應用到元素的內容及元素的全部子元素上。
SOAP Header 元素
actor 屬性,語法soap:actor="URI"
經過沿着消息路徑通過不一樣的端點,SOAP 消息可從某個發送者傳播到某個接收者。並不是 SOAP 消息的全部部分都打算傳送到 SOAP 消息的最終端點,不過,另外一個方面,也許打算傳送給消息路徑上的一個或多個端點。SOAP 的 actor 屬性可被用於將 Header 元素尋址到一個特定的端點。
mustUnderstand 屬性 ,語法soap:mustUnderstand="0|1"
SOAP 的 mustUnderstand 屬性可用於標識標題項對於要對其進行處理的接收者來講是強制的仍是可選的。假如您向 Header 元素的某個子元素添加了 "mustUnderstand="1",則要求處理此頭部的接收者必須承認此元素。
<? xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Header> <m:Trans xmlns:m="http://www.jsoso.net/transaction/" soap:mustUnderstand="1" soap:actor="http://www.w3schools.com/appml/ 「 >234</m:Trans> </soap:Header> ... ... </soap:Envelope>
SOAP Body 元素
必需的 SOAP Body 元素可包含打算傳送到消息最終端點的實際 SOAP 消息。Body元素中既能夠包含SOAP定義的命名空間中的元素,如Fault,也能夠是用戶的應用程序自定義的元素。如下是一個用戶定義的請求:
<? xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body> <m:GetPrice xmlns:m="http://www.jsoso.net/prices"> <m:Item>Apples</m:Item> </m:GetPrice> </soap:Body> </soap:Envelope>
上面的例子請求蘋果的價格。請注意,上面的 m:GetPrice 和 Item 元素是應用程序專用的元素。它們並非 SOAP 標準的一部分。既然有請求,那麼確定是要有響應的,下面就是對應soap的響應:
SOAP Fault 元素
Fault 元素表示 SOAP的錯誤消息。它必須是 Body 元素的子元素,且在一條 SOAP 消息中,Fault 元素只能出現一次。Fault 元素擁有下列子元素:
經常使用的SOAP Fault Codes
HTTP協議中的SOAP 實例
下面的例子中,一個 GetStockPrice 請求被髮送到了服務器。此請求有一個 StockName 參數,而在響應中則會返回一個 Price 參數。此功能的命名空間被定義在此地址中: "http://www.jsoso.net/stock"
SOAP 請求:(注意HTTP的Head屬性)
POST /InStock HTTP/1.1 Host: www.jsoso.net Content-Type: application/soap+xml; charset=utf-8 Content-Length: XXX <? xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.jsoso.net/stock"> <m:GetStockPrice> <m:StockName>IBM</m:StockName> </m:GetStockPrice> </soap:Body> </soap:Envelope>
SOAP 響應:(注意HTTP的Head屬性)
HTTP/1.1 200 OK Content-Type: application/soap+xml; charset=utf-8 Content-Length: XXX <? xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.jsoso.net/stock"> <m:GetStockPriceResponse> <m:Price>34.5</m:Price> </m:GetStockPriceResponse> </soap:Body> </soap:Envelope>
HTTP協議中的SOAP RPC工做流程