2012-06-11 272 views
73

我目前弄清楚類似的是使用互聯網協議(HTTP)在消費者和提供者之間交換數據。比較和對比REST和SOAP Web服務?

的區別是:

  1. SOAP是基於XML的消息的協議,而REST是一種架構風格
  2. SOAP使用WSDL爲消費者和提供者之間的通信,而REST只是使用XML或JSON來發送和接收數據
  3. SOAP調用RPC方法調用服務,REST只是簡單的通過URL路徑
  4. SOAP不返回人類可讀的結果,而REST結果是可反應,只是普通的XML或JSON
  5. 012電話服務
  6. SOAP不只是通過HTTP,該機還採用其他協議如SMTP,FTP等,REST是在只有HTTP

這就是我知道它們之間的區別的一切。任何人都可以糾正我,並添加更多。

+16

他們是不可比的,至少因爲SOAP是一個協議,將其餘的沒有定義的規範可言的概念。沒有人禁止編寫與REST兼容的SOAP Web服務。 –

回答

54

SOAP使用WSDL通信BTW消費者和提供者,而 REST只是使用XML或JSON發送和接收數據

WSDL定義客戶端和服務之間的合同,是由它的性質是靜態的。如果REST協議有些複雜並且由HTTP,URI,媒體格式和應用程序特定協調協議定義。與WSDL不同,它是高度動態的。

SOAP不返回人類可讀的結果,而REST結果是可反應,只是普通的XML或JSON

這是不正確的。純XML或JSON根本不是RESTful。它們都沒有定義任何違反REST的控件(即鏈接和鏈接關係,方法信息,編碼信息等),只要消息必須是自包含的並且協調代理/客戶端和服務之間的交互。

使用鏈接+語義鏈接關係客戶端應該能夠確定什麼是下一個交互步驟並遵循這些鏈接並繼續與服務進行通信。

消息不必是人類可讀的,可以使用隱含的格式並構建完全有效的REST應用程序。信息是否是人類可讀的並不重要。因此,純XML(application/xml)或JSON(應用程序/ json)不足以構建REST應用程序。使用這些具有強大語義含義的通用媒體類型的子集並且提供足夠的控制信息(鏈接等)來協調客戶端和服務器之間的交互總是合理的。

REST是在只有HTTP

不正確,HTTP被廣泛使用,當我們談論REST Web服務時,我們只假設HTTP。 HTTP定義了與其方法(GET,POST,PUT,DELETE,PATCH等)的接口以及可以統一用於與資源進行交互的各種頭文件。這種均勻性也可以通過其他協議來實現。

P.S. REST非常簡單但很有趣的解釋:http://www.looah.com/source/view/2284

+0

+1最後一個鏈接(「我如何向我的妻子解釋REST」) –

0

SOAP帶來了自己的協議,並專注於將應用程序邏輯(而不是數據)作爲服務公開。 SOAP公開操作。 SOAP專注於訪問命名操作,每個操作都通過不同的接口實現一些業務邏輯。

雖然SOAP通常被稱爲「Web服務」,但這是一個誤稱。如果與Web有任何關係,SOAP就很少。 REST基於URI和HTTP提供真正的「Web服務」。

作爲例子,這裏有幾個電話和他們適當的家庭與評論。

getUser(User); 

當您訪問資源(數據)時,這是一個休息操作。

switchCategory(User, OldCategory, NewCategory) 

REST允許許多不同的數據格式,因爲SOAP只允許XML。雖然這看起來似乎增加了REST的複雜性,因爲您需要處理多種格式,但根據我的經驗,它確實非常有用。 JSON通常更適合數據並且解析速度更快。由於支持JSON,REST可以更好地支持瀏覽器客戶端。

+4

有趣的是,這個答案正是[this](http://spf13.com/post/soap-vs-rest/)2010年1月的博客文章說...幾乎一字不差 – brazilianldsjaguar

+0

「(not data)」= FALSE - SOAP Web服務中的WSDL爲返回的數據輸入/輸出提供了非常豐富和清晰的描述,因此可以根據XSD輕鬆地對數據進行序列化/反序列化。合同'。這就是爲什麼它在.Net/WCF –

+0

(「SOAP只允許使用XML」)中被稱爲「DataContract」的原因 - 並不意味着您無法保持XML標記非常輕並且嵌入任何其他格式包括JSON或base64編碼數據。如果您認爲SOAP數據必須用標記(XML)包裝,那麼它足夠簡單,可以反駁JSON還需要標記包裝才能從點A到點B.它足夠簡單,可以使用SOAP Web服務JavaScript。 –

4

在日常的實際編程術語中,最大的區別在於,使用SOAP時,您正在使用靜態和強烈定義的數據交換格式,與REST一樣和JSON數據交換格式比較起來很鬆散。例如,使用SOAP,您可以驗證交換的數據是否與XSD模式匹配。因此,XSD作爲客戶和服務器如何理解交換數據的結構的「契約」。

JSON數據是通常不是根據強烈定義的格式傳遞(除非您使用支持它的框架,例如http://msdn.microsoft.com/en-us/library/jj870778.aspx或實現json-schema)。

在-事實上,一些(許多/大多數)會爭辯說,JSON的「動態」的祕密武器的推移,用於在動態工作數據合同(Should JSON RESTful web services use data contract

人們制約它的對哲學/文化鬆散類型的語言傾向於對JSON的鬆散感覺更舒適,而來自強類型語言的開發人員更喜歡XML。

http://www.mnot.net/blog/2012/04/13/json_or_xml_just_decide

+0

protobuf比XML更強類型化! – fread2281

+0

從[documentation](https://code.google.com/p/protobuf/):「..您使用協議緩衝區編譯器protoc編譯[數據],以便在C++,Java或Python中生成代碼「 - 似乎非常有限。直接JSON和SOAP不會受到這些限制,因爲整個觀點都是語言中立的。 –

+0

@ fread2281 protobuf沒有更強的類型(這不是真的)。這是一個高性能的有線協議,它需要編譯後的代碼來支持最新的格式(@ Michael.M),實際上它與SOAP的侷限性沒有什麼不同,必須在每端部署WSDL和代碼才能應對與最新的格式。 –