之前一直想寫些RESTful相關的文章,卻一直未付諸行動。直到最近接手一個新的項目,對這塊重新溫習,乘此機會寫些相關帖子。歡迎大家評論留言,如有錯漏之處,也望各位大佬不令賜教。
話不多說,干活頂上。
SOAP(Simple Object Access Protocol - 簡單對象訪問協議)定義了一種強類型的消息傳遞框架,該框架高度依賴XML和schemas。
REST(Representation State Transfer - 表示狀態轉移)是一種架構樣式風格,它利用了當下被廣泛采用的技術(特別是HTTP),本身卻不創建任何新的標准。REST可以將數據結構序列化為XML,YAML或任何其他機器可讀格式,但通常首選JSON。
SOAP和REST都支持構建基於應用程序的SOA(Service-oriented architecture,面向服務的架構),在實際項目中如何選擇主要看業務的需求是什么。那如何選擇呢?
這便是今天的重點,討論下兩者的主要區別。今天主要從一下幾個方面進行區別:
底層協議
- SOAP本身便是基於HTTP而發展的協議。
- REST與HTTP幾乎一樣,REST規范沒有強制的要求。
數據格式
- SOAP只依靠XML來提供消息傳遞服務。在某些情況下,消息傳遞服務可能變得極其復雜。例如,通過javascript訪問Web服務,
- REST可以語言自由的選擇易解析的數據格式。例如,CSV、JSON、XML、YAML等等。
有狀態
- SOAP Web服務是無狀態的,但是可以通過修改服務器上的代碼輕松變為有狀態的。
- RESTful Web服務是完全無狀態的。對話狀態的管理完全由客戶端進行控制。服務端不保留任何狀態信息。也就是我們通常所說的,客戶端的每次請求必須攜帶所有可能用到的信息。
HTTP的方法使用
- SOAP可以對HTTP協議進行綁定。當綁定HTTP協議時,所有的SOAP請求都通過HTTP POST發送。
- REST主要使用HTTP協議。通過HTTP GET、POST、PUT、DELETE和PATCH方法進行CRUD操作。
緩存
- SOAP可以使用HTTP傳輸機制,但是都轉換為HTTP POST方法。而POST是非冪等的,所以無法在HTTP級別進行緩存。因此SOAP的響應需要通過 Response Caching Optimization Module給的信息進行緩存。
- REST可以發送HTTP GET請求,GET是冪等的,因此REST可以使用HTTP提供的緩存機制,使響應數據可以標記為可緩存或不可緩存。
安全
- SOAP通過WS-SECURITY對安全進行了很好的標准化。
- REST主要使用HTTP協議,HTTP本身是非常不安全的,但通過TLS它可以支持基礎的身份認證和通信加密,即HTTPS。此外,在服務器上還可以進一步實施安全措施。
異步處理
創建和更新通常非常消耗資源,有時會需要異步請求處理。
- SOAP 1.2提供了額外的標准,可保證應用的可靠性和安全性。例如:WSRM – WS-Reliable Messaging。
- REST我們通常返回HTTP狀態碼202(Accepted)和隊列位置,該位置上,任務的完成狀態將會被定期更新(當然,我們也可以將完成狀態信息存在數據庫中,並定期新增狀態信息,供客戶端查詢)。
總結
總體而言,REST更易於開發,因為它利用了已經存在的Web,並且自由度受到限制(做出的選擇更少,因此更簡單)。SOAP提供了多種選擇,並且開發難度也稍大一些,但是提供了更多的選擇。