今天有人問了我這樣一個問題:“為什麼會有人選擇 SOAP(
Simple Object Access Protocol,簡單對象通路協定) 而不是 REST(
Representational State Transfer,表述性狀态傳遞)呢?”我的回答是:“我常常聽到的一般經驗性法則是‘
除非你有一個明确的理由去使用 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