比较和对比REST和SOAP网络服务?

77

我现在发现它们的共同点是都使用互联网协议(HTTP)来在消费者和提供者之间交换数据。

它们的区别在于:

  1. SOAP是基于XML的消息协议,而REST是一种架构风格
  2. SOAP使用WSDL在消费者和提供者之间进行通信,而REST仅使用XML或JSON发送和接收数据
  3. SOAP通过调用RPC方法来调用服务,而REST只需通过URL路径调用服务
  4. SOAP不返回可读的结果,而REST结果是可读的,只是一个纯粹的XML或JSON
  5. SOAP不仅限于HTTP,还使用其他协议,如SMTP、FTP等,REST仅限于HTTP

这就是我所知道的它们之间的区别。有人能帮我纠正并添加更多内容吗?


18
至少从SOAP是一个协议而REST只是一个没有明确定义规范的概念来看,它们是无法比较的。并没有什么阻止我们编写一个与REST兼容的SOAP Web服务。 - Sergey Kudriavtsev
(1) "SOAP是一种基于XML的消息协议" (2) "SOAP不返回人类可读的结果"结论:XML不是人类可读的。但很明显...可以说其中一个前提是错误的吗? - JensG
3个回答

54
SOAP使用WSDL在消费者和提供者之间进行通信,而REST只使用XML或JSON来发送和接收数据。
WSDL定义了客户端和服务之间的契约,其本质上是静态的。在REST的情况下,契约有些复杂,并由HTTP、URI、媒体格式和应用程序特定的协调协议来定义。它与WSDL不同,高度动态。
SOAP不返回可读的结果,而REST结果是可读的,只是纯粹的XML或JSON。
这并不正确。纯粹的XML或JSON根本不符合RESTful。它们都没有定义任何控件(例如链接和链接关系、方法信息、编码信息等),这与REST相违背,因为消息必须是自包含的,并协调代理/客户端和服务之间的交互。
通过链接+语义链接关系,客户端应该能够确定下一个交互步骤,并跟随这些链接并继续与服务通信。
消息是否可读并不重要,可以使用加密格式构建完全有效的REST应用程序。
因此,纯XML(application/xml)或JSON(application/json)不足以构建REST应用程序。始终可以使用这些通用媒体类型的子集,它们具有强烈的语义意义,并提供足够的控制信息(链接等)以协调客户端和服务器之间的交互。
有关控制信息的更多详细信息,我强烈建议阅读以下内容:http://www.amundsen.com/hypermedia/hfactor/ Web链接:https://www.rfc-editor.org/rfc/rfc5988 注册链接关系:http://www.iana.org/assignments/link-relations/link-relations.xml

REST仅限于HTTP

不正确,HTTP是最广泛使用的,当我们谈论REST Web服务时,我们只是假设HTTP。 HTTP使用其方法(GET,POST,PUT,DELETE,PATCH等)和各种标头定义接口,可用于统一与资源交互。这种统一性也可以通过其他协议实现。
P.S. 这里有一个非常简单但有趣的 REST 解释:http://www.looah.com/source/view/2284

+1 最后一个链接(“我如何向我的妻子解释REST”) - Maxim Chetrusca

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


protobuf比XML更加强类型化! - fread2281
文档中可以看到:"..你可以使用协议缓冲区编译器protoc将数据编译成C++、Java或Python代码" - 看起来非常有限。而纯粹的JSON和SOAP并不受这些限制,因为它们的整个目的就是保持语言中立性。 - Michael M
@fread2281 protobuf并不是更强类型(这实际上并不存在)。它是一种高性能的线路协议,需要编译代码来支持最新的格式,(@Michael.M) 实际上与SOAP的限制并没有太大区别,在SOAP中,你必须在每个端点部署WSDL和代码以应对最新的格式。 - Rob Grant

0

SOAP带有自己的协议,专注于将应用程序逻辑(而不是数据)公开为服务。 SOAP公开操作。 SOAP专注于访问命名操作,每个操作通过不同的接口实现一些业务逻辑。

尽管SOAP通常被称为“Web服务”,但这是一个错误的说法。 SOAP与Web几乎没有任何关系。 REST基于URI和HTTP提供真正的“Web服务”。

以下是一些调用及其适当的主页以及评论说明。

getUser(User);

这是一个 REST 操作,因为您正在访问资源(数据)。

switchCategory(User, OldCategory, NewCategory)

REST 允许多种不同的数据格式,而 SOAP 只允许 XML。虽然这似乎给 REST 增加了复杂性,因为您需要处理多个格式,但根据我的经验,它实际上非常有益。JSON 通常更适合于数据,并且解析速度更快。由于其对 JSON 的支持,REST 对于浏览器客户端提供更好的支持。


4
有趣,这个答案与这篇2010年1月的博客文章几乎是一模一样的...几乎是逐字逐句。 - brazilianldsjaguar
"(not data)" = FALSE - 在SOAP Web服务中,WSDL提供了非常丰富和清晰的描述,用于返回数据的输入/输出,以便根据XSD“合同”轻松序列化/反序列化数据。这就是为什么在.Net/WCF中它被称为“DataContract”的整个原因。 - Michael M
“SOAP仅允许XML”并不意味着您不能使XML标记非常轻便,并嵌入任何其他格式,包括JSON或base64编码数据。如果您认为SOAP数据必须包装在标记(XML)中,那么简单地反驳一下,JSON也需要其标记包装才能从A点到B点。使用JavaScript消费SOAP Web服务非常简单。 - Michael M
REST允许对浏览器客户端提供更好的支持,因为它支持JSON,但这是假的-旧浏览器不支持原生的JSON解析(https://dev59.com/ynNA5IYBdhLWcg3wn_Q1)。通过JavaScript进行SOAP调用的HTTP请求自AJAX时代以来就已经可以了。jQuery SOAP是一个库的例子,它使得从浏览器中运行jQuery JavaScript代码的地方非常简单地调用SOAP服务,你能指出另一种方式使它变得“更好”吗? - Michael M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接