簡單對象訪問協(xié)議 (SOAP ,全寫為Simple Object Access Protocol )是一種標(biāo)準(zhǔn)化的通訊規(guī)范,主要用于Web服務(wù) (web service)中。SOAP的出現(xiàn)是為了簡化網(wǎng)頁服務(wù)器(Web Server)在從XML數(shù)據(jù)庫中提取資料時,無需花時間去格式化頁面,并能夠讓不同應(yīng)用程式之間透過HTTP通訊協(xié)定,以XML 格式互相交換彼此的資料,使其與編程語言、平臺和硬件無關(guān)。此標(biāo)準(zhǔn)由IBM、Microsoft、UserLand和DevelopMentor在1998年共同提出,并得到IBM,蓮花(Lotus),康柏(Compaq)等公司的支持,于2000年提交給萬維網(wǎng)聯(lián)盟 (World Wide Web Consortium ;W3C),目前 SOAP 1.1 版是業(yè)界共同的標(biāo)準(zhǔn),屬于第二代的XML協(xié)定(第一代具主要代表性的技術(shù)為XML-RPC以及WDDX)。
用一個簡單的例子來說明 SOAP 使用過程,一個 SOAP 消息可以發(fā)送到一個具有 Web Service 功能的 Web 站點,例如,一個含有房價信息的數(shù)據(jù)庫,消息的參數(shù)中標(biāo)明這是一個查詢消息,此站點將返回一個 XML 格式的信息,其中包含了查詢結(jié)果(價格,位置,特點,或者其他信息)。由于數(shù)據(jù)是用一種標(biāo)準(zhǔn)化的可分析的結(jié)構(gòu)來傳遞的,所以可以直接被第三方站點所利用。
目前在三種主流的Web服務(wù) 實現(xiàn)方案中,因為REST模式的Web服務(wù) 與復(fù)雜的SOAP 和XML-RPC 對比來講明顯的更加簡潔,越來越多的web服務(wù)開始采用REST風(fēng)格設(shè)計和實現(xiàn)。例如,Amazon.com 提供接近REST風(fēng)格的Web服務(wù)進(jìn)行圖書查找;雅虎 提供的Web服務(wù)也是REST風(fēng)格的。
<script type="text/javascript"> //<![CDATA[ if (window.showTocToggle) { var tocShowText = "顯示"; var tocHideText = "隱藏"; showTocToggle(); } //]]> </script>
REST 從資源的角度來觀察整個網(wǎng)絡(luò),分布在各處的資源由URI 確定,而客戶端的應(yīng)用通過URI來獲取資源的表形。獲得這些表形致使這些應(yīng)用程序轉(zhuǎn)變了其狀態(tài)。隨著不斷獲取資源的表形,客戶端應(yīng)用不斷地在轉(zhuǎn)變著其狀態(tài),所謂表形化的狀態(tài)轉(zhuǎn)變(Representational State Transfer)。
這一觀點不是憑空臆造的,而是通過觀察當(dāng)前Web互聯(lián)網(wǎng)的運作方式而抽象出來的。Roy Fielding 認(rèn)為,
“ | 設(shè)計良好的網(wǎng)絡(luò)應(yīng)用表現(xiàn)為一系列的網(wǎng)頁,這些網(wǎng)頁可以看作的虛擬的狀態(tài)機 ,用戶選擇這些鏈接導(dǎo)致下一網(wǎng)頁傳輸?shù)接脩舳苏宫F(xiàn)給使用的人,而這正代表了狀態(tài)的轉(zhuǎn)變。 | ” |
需要注意的是,REST是一種設(shè)計風(fēng)格而不是 一個標(biāo)準(zhǔn)。REST通?;谑褂?a target="_blank" >HTTP ,URI ,和XML 以及HTML 這些現(xiàn)有的廣泛流行的協(xié)議和標(biāo)準(zhǔn)。
應(yīng)該注意區(qū)別應(yīng)用的狀態(tài)和連接協(xié)議的狀態(tài)。REST對于連接的無狀態(tài)性實際上要求每次經(jīng)過無狀態(tài)的連接協(xié)議傳送的信息必須包含應(yīng)用中所有的狀態(tài)信息。
例如,一個簡單的網(wǎng)絡(luò)商店應(yīng)用,
列舉所有商品,
GET http://www.store.com/products
具體某一件商品,
GET http://www.store.com/product/12345
下單購買,
POST http://www.store.com/order, <purchase-order> <item> ... </item> </purchase-order>