天天看點

REST Vs SOAP,Soap 和 Rest 的差別

今天有人問了我這樣一個問題:“為什麼會有人選擇 SOAP(

​​Simple Object Access Protocol​​,簡單對象通路協定) 而不是 REST(

​​Representational State Transfer​​,表述性狀态傳遞)呢?”我的回答是:“我常常聽到的一般經驗性法則是‘

除非你有一個明确的理由去使用 SOAP,否則的話就使用 REST’”。他又問:“比如?”我想了一分鐘,然後老實地回答說我還沒有碰到過這樣一個理由。我的背景是建構大型網際網路公司。

REST Vs SOAP,Soap 和 Rest 的差別

盡管他貌似滿足于我剛才的回答,但是我卻對那樣的答案不太滿意。對此我做了一些功課,本文是我就 REST vs SOAP 做的一些總結,将對 SOAP 和 REST 之間的差別,以及為何有人會選擇 SOAP 進行闡述。像往常一樣,通過對比每種技術的意義來讓我們了解到如何進行取舍(幸運的是答案常常會是 REST)。

我對它們的闡述明顯有些言簡意赅,是以對于我把事情弄的如此簡化請勿拍磚,但欠妥的地方還請不吝指正。

定義

REST

REST 的最佳場景是當你通過網際網路公開一個公共 API 來對資料的 CRUD 操作進行處理的時候。REST 專注于通過一個一緻性接口通路命名資源。

SOAP

SOAP 提供了自己的協定并專注于公開某些應用邏輯(不是資料)為服務。SOAP 公開的是操作。SOAP 專注于通路通過不同的接口實作了某些業務邏輯的命名操作。

SOAP 常常被稱作“​​web services​​”,這是一個誤稱。SOAP 和 web 基本上說不上話。REST 提供的才是真正的基于 URL 和 HTTP 的 “web services”。

以下是幾個調用方式示範,并附以相關解釋。

getUser(User);      

上面這是一個 REST 操作,因為你正在對一個資源(資料)進行通路。

switchCategory(User, OldCategory, NewCategory)      

由于你是在執行一個操作是以上面這是一個 SOAP 操作。

當然,上述兩種調用都既可以用 SOAP 也可以用 REST。示範的目的是用來了解它們在概念上的差別。

Why REST?

接下來解釋為何 REST 幾乎總是正确的答案。

REST 使用了标準 HTTP 是以它做什麼都更加簡單。建立用戶端,開發 API,文檔更易于了解,而且沒有一件事用 REST 做起來不比 SOAP 更簡單/更好。

REST 允許很多不同的資料格式而 SOAP 僅支援 XML。雖然這樣看起來給 REST 增加了複雜度因為你需要處理多種格式,但以我的經驗來看這樣實際上有很多好處。JSON 通常更适用于承載資料而且解析起來更快。由于其對 JSON 的支援,REST 允許我們更好地支援浏覽器用戶端。

REST 具備更好的性能和可擴充性。REST 讀取可以被緩存起來,而基于 SOAP 的讀取無法被緩存。

用來做論據不太好(權威),但是值得一提的是 Yahoo 的包括 Flickr 和 del.ici.ous 在内的所有服務都使用了 REST。Amazon 和 Ebay 兩種都有使用,盡管 Amazon 内部使用的幾乎全都是 REST ​​資源​​​。Google 曾經對于他們所有的服務僅提供 SOAP,但 2006 年起 Google 棄用了 SOAP 轉投 REST ​​資源​​。有趣的是在 Amazon 内部是否也有過關于 REST Vs SOAP 的争議,但是最終還是 REST 主宰了他們 web services 的架構。

Why SOAP?

接下來列舉一些你可能想要使用 SOAP 的原因。

web services 安全

SOAP 不僅像 REST 一樣支援 SSL,而且還支援增加了很多企業級安全特性的 WS-Security(WS = web services)。是以它能夠提供通過中介的身份驗證,而不僅僅是端對端的驗證(SSL)。此外,SOAP 還提供了一個資料完整性和資料隐私性的标準實作。叫它“企業級”并不是說它更安全,它隻是簡單提供了典型網際網路服務不需要的幾個安全工具而已,事實上這些工具隻有在很少的一些“企業級”場景下才能派的上用場。

web services 原子性事務

如果服務需要 ACID 事務的話,那麼你就需要 SOAP 了。盡管 REST 也支援事務,但它并非完整性的而且不具備 ACID。幸運的是 ACID 事務對于網際網路來說幾乎沒有任何意義。REST 受限于 HTTP,HTTP 本身無法提供兩階段送出分布式事務資源,但是 SOAP 可以。網際網路應用一般不會需要這等級别的事務可靠性,企業級應用有時會需要。

web services 消息可靠性

REST 不具備一個标準的消息體系,它期望用戶端通過重試來處理通信失敗。SOAP 具備内置的成功/重試邏輯并通過 SOAP 中介來提供端對端的可靠性。

總結

總之,SOAP 顯然是有用的,而且還很重要。例如,如果我去寫一個連接配接到我的銀行的 iPhone 應用那麼我當然需要使用 SOAP。上述三點特性都是銀行事務所必須的。比如,如果我将資金從一個賬戶轉移到另外一個賬戶,我需要确定它的完成。

如果第一次轉賬成功,但響應失敗,這個時候的 REST 重試将會是災難性的。

參考資料

  • ​​為何不使用 SOAP​​
  • ​​SOAP 還是 REST?​​
  • ​​再見,Google SOAP 搜尋 API​​
  • ​​SOAP Vs REST​​