出處:http://xiaobaila.blog.163.com/blog/static/189705129201141965434571/
SOAP與REST比較
如今,Web開發者的可選技術相當之多;從簡化的數據庫訪問技術,到易用的中間件服務包裝技術,以及各種有趣的客戶端軟件等等,一應俱全。所有這些產品和工具,都是為了幫助Web開發者用最快的速度開發出最好的Web應用。
然而,擁有大量可選軟件方案以及為Web應用的特定部分選用特定方案,都是具有挑戰的事;而且,現在Web開發者必須持續跟蹤各種不斷變化着的標准與方法。
舉個例子,Web服務技術就有SOAP(Simple Object Access Protocol,簡單對象訪問協議)和REST(Representational State Transfer,表示性狀態轉移)這兩種方案。它們都是有效的方案,但在具體場合下采用哪種方案好,這要取決於Web開發者。
目前,大部分Web開發者似乎都了解REST——一種采用標准URI進行調用的方案。REST很容易理解,而且只要是支持HTTP/HTTPS的客戶端/服務器就支持它。你可以用HTTP GET方法來執行命令。所以,開發者們感受到的REST的優勢是:開發簡單、只需依托現有Web基礎設施、以及學習成本低。
然而,SOAP作為一種古老的Web服務技術,短期內還不會退出歷史舞台。而且,隨着SOAP 1.2的出現,SOAP印象中的一些缺點已得到改進,采納率和易用程度也都得到提高。另需注意的是,從W3C SOAP 1.2版開始,SOAP這一縮寫不再代表Simple Object Access Protocol(簡單對象訪問協議),而是僅僅作為協議名稱而已。
相對REST而言,SOAP 1.2多出一些開銷,不過這些開銷也帶來了一些好處。
首先,SOAP在三個方面離不開XML(Extensible Markup Language,可擴展標記語言):
· SOAP信封(envelope)是基於XML的,它定義了消息里有什么以及如何處理它;
· 一套用於數據類型的編碼規則;
· 過程調用和響應的規划。
SOAP信封由傳輸協議(HTTP/HTTPS)發出,RPC(Remote Procedure Call,遠程過程調用)得到執行,然后一個XML文檔隨SOAP信封返回。
需要注意的是,基於“通用”傳輸協議是SOAP的一個優點。REST目前基於HTTP/HTTPS;而SOAP可支持任何傳輸協議,從HTTP /HTTPS到SMTP(Simple Mail Transfer Protocol,簡單郵件傳送協議),甚至JMS(Java Messaging Service,Java消息傳遞服務)。不過,由於XML較為冗長且解析費時,因此采用XML也成為一個弊端。
不過,對Web開發者來說的好消息是,目前上述兩種方案都是行之有效的方案。REST和SOAP都能解決許多Web方面的問題與挑戰,而且在許多情況下,它們各自都能滿足開發者的要求,也就是說可互換使用。
但很多人不知道,這兩種技術可以混合搭配使用。REST很好理解,且極易上手;不過由於它缺乏標准,因此只被看作是一種架構方法。與之相比,SOAP是一個工業標准,它具備良好定義的協議,以及一套良好確立的規則,在大型和小型系統中均有采用。
因此,REST的適用場合包括:
* 有限的帶寬和資源別忘了返回的結構可以采用(由開發者定義的)任何格式。另外,由於REST采用標准的GET、PUT、POST和DELETE動詞,因此可被任何瀏覽器所支持。除此以外,REST還可以使用為目前大多數瀏覽器支持的XMLHttpRequest對象,這為AJAX增色不少。
* 完全無狀態的操作對於那些需多步執行的操作,REST並非最佳選擇,采用SOAP更合適。但是,如果你需要無狀態的CRUD(Create/Read/Update /Delete,創建/讀取/更新/刪除)操作,那么應采用REST。
* 緩存考慮若要利用無狀態操作的特性,使得信息可被緩存,那么REST是很好的選擇。
以上已經覆蓋很多方案了,那么,為什么還要考慮SOAP呢?正如前述,SOAP比較成熟而且是經過良好定義的,具有完整的規范。而REST只不過是一種方法,對開發未作任何規約;因此,假如你遇到以下場合,那么SOAP是最佳選擇:
* 異步處理與調用
如果你的應用需要確保可靠性與安全性,那么請采用SOAP。SOAP 1.2為確保這種操作補充定義了WSRM(WS-Reliable Messaging)等標准。
* 形式化契約
若提供者/消費者雙方必須就交換格式取得一致,那么采用SOAP更合適。SOAP 1.2為這種交互提供了嚴格的規范。
* 有狀態的操作
如果應用需要上下文信息與對話狀態管理,那么應采用SOAP。
SOAP 1.2為此補充定義了WS-Security、WS-Transactions和WS-Coordination等標准。相比之下,REST方法要求開發者自己來實現這些框架性工作。
正如你所看到的,REST和SOAP各自有其用武之地。它們在安全性和傳輸層等方面有着自己的潛在問題,不過它們都能完成任務,而且在許多情況下,它們都豐富了Web的技術手段。因此,就這一論題,其實最好的原則就是靈活性原則;因為至少在現今的Web開發中,無論面對何種問題,Web開發者們總有辦法運用好這兩種技術中的一種。