我读过关于SOAP和REST作为web服务通信协议的区别的文章,但是我认为REST相对于SOAP的最大优势是:

REST更加动态,不需要创建和更新UDDI(通用描述、发现和集成)。 REST不仅限于XML格式。RESTful web服务可以发送纯文本/JSON/XML。

但是SOAP更加标准化(例如:安全性)。

那么,这些点我说对了吗?


当前回答

尽管SOAP和REST在HTTP协议上有相似之处,但SOAP是一组比REST更严格的消息传递模式。SOAP中的规则是相关的,因为没有它们我们就无法实现任何程度的标准化。REST作为一种体系结构风格不需要处理,而且本质上更通用。本着信息交换的精神,SOAP和REST都依赖于公认的法律,每个人都决定遵守这些法律。 SOAP和REST的选择取决于所使用的编程语言、所使用的环境和规范。

其他回答

不幸的是,关于REST有很多错误的信息和误解。不仅你的问题和@cmd的答案反映了这些,而且Stack Overflow上大多数与主题相关的问题和答案都反映了这些。

SOAP和REST不能直接比较,因为前者是一种协议(或者至少试图是),而后者是一种体系结构风格。这可能是引起混淆的原因之一,因为人们倾向于调用REST任何不是SOAP的HTTP API。

稍微推敲一下,试着建立一个比较,SOAP和REST之间的主要区别是客户机和服务器实现之间的耦合程度。SOAP客户机的工作方式类似于自定义桌面应用程序,与服务器紧密耦合。客户端和服务器之间有一个严格的契约,如果任何一方改变了任何东西,一切都将被打破。你需要在任何变化之后不断更新,但这样更容易确定合同是否被遵守。

REST客户机更像一个浏览器。它是一个通用的客户端,知道如何使用协议和标准化方法,应用程序必须适应其中。创建额外的方法不会违反协议标准,而是利用标准方法并在媒体类型上使用它们创建操作。如果处理得当,耦合会减少,并且可以更优雅地处理更改。除了入口点和媒体类型之外,客户端应该在对API一无所知的情况下进入REST服务。在SOAP中,客户端需要对它将要使用的所有东西有预先的了解,否则它甚至不会开始交互。此外,REST客户机可以通过服务器本身提供的按需代码进行扩展,经典的例子是用于驱动与客户端另一个服务的交互的JavaScript代码。

我认为这些是理解REST是什么以及它与SOAP有何不同的关键点:

REST是协议独立的。它不与HTTP耦合。就像您可以在网站上跟踪ftp链接一样,REST应用程序可以使用任何具有标准化URI方案的协议。 REST不是CRUD到HTTP方法的映射。阅读下面的答案,了解详细的解释。 REST与您正在使用的部件一样标准化。HTTP中的安全性和身份验证是标准化的,因此在通过HTTP执行REST时使用的就是这些。 没有超媒体和HATEOAS, REST就不是REST。这意味着客户端只知道入口点URI,资源应该返回客户端应该遵循的链接。那些花哨的文档生成器为您在REST API中可以做的所有事情提供URI模式,它们完全忽略了这一点。他们不仅记录应该遵循标准的东西,而且当你这样做的时候,你把客户端耦合到API发展的一个特定时刻,API上的任何更改都必须被记录和应用,否则它就会崩溃。 REST是web本身的架构风格。当你进入Stack Overflow时,你知道什么是用户、问题和答案,你知道媒体类型,网站为你提供了指向它们的链接。REST API也必须做同样的事情。如果我们按照人们认为REST应该做的方式来设计网页,而不是有一个带有问答链接的主页,我们将有一个静态文档来解释为了查看一个问题,你必须使用URI stackoverflow.com/questions/<id>,将id替换为问题。Id并粘贴到浏览器上。这是无稽之谈,但这就是许多人认为的REST。

最后一点怎么强调都不为过。如果您的客户端从文档中的模板构建uri,而不是从资源表示中获取链接,那就不是REST。REST的作者Roy Fielding在这篇博客文章中明确表示:REST api必须是超文本驱动的。

考虑到以上内容,您将意识到尽管REST可能不局限于XML,但要正确地使用任何其他格式,您必须为链接设计和标准化某种格式。超链接在XML中是标准的,但在JSON中不是。JSON有一些标准草案,比如HAL。

最后,REST并不适合所有人,最能证明这一点的就是大多数人是如何用他们错误地称为REST的HTTP api很好地解决他们的问题的,而且从来没有冒险超越它。REST有时很难做到,尤其是在开始的时候,但是随着时间的推移,它会带来更容易的服务器端的发展,以及客户端对变化的弹性。如果你需要快速轻松地完成某件事,就不要为正确使用REST而烦恼了。这可能不是你要找的。如果您需要一些必须在网上保持数年甚至数十年的东西,那么REST就是为您准备的。

尽管SOAP和REST在HTTP协议上有相似之处,但SOAP是一组比REST更严格的消息传递模式。SOAP中的规则是相关的,因为没有它们我们就无法实现任何程度的标准化。REST作为一种体系结构风格不需要处理,而且本质上更通用。本着信息交换的精神,SOAP和REST都依赖于公认的法律,每个人都决定遵守这些法律。 SOAP和REST的选择取决于所使用的编程语言、所使用的环境和规范。

恕我直言,你不能比较SOAP和REST,因为它们是两种不同的东西。

SOAP是一种协议,REST是一种软件体系结构模式。在互联网上有很多关于SOAP和REST的误解。

SOAP定义了基于XML的消息格式,支持web服务的应用程序使用该格式在internet上相互通信。为了做到这一点,应用程序需要事先了解消息契约、数据类型等。

REST表示来自URL的服务器的状态(作为资源)。它是无状态的,客户端不应该有超出超媒体理解范围的与服务器交互的先验知识。

在众多答案中已经涉及的许多问题中,我将强调SOAP允许定义契约、WSDL(定义所支持的操作)、复杂类型等。 SOAP面向操作,而REST面向资源。 就我个人而言,对于企业内部应用程序之间的复杂接口,我会选择SOAP,而对于与外部世界的公共的、更简单的、无状态的接口,我会选择REST。

什么是REST

REST代表具象状态传输,它实际上是一种创建Web API的架构风格,它将一切(数据或功能)视为资源。 预计;通过URI公开资源,以多种格式进行响应,并以无状态方式对资源的状态进行代表性传输。这里我要讲两件事:

无状态方式:由HTTP提供。 状态的代表性转移:例如,如果我们要增加一名员工。 进入我们的系统,它在HTTP的POST状态,之后它将在HTTP的GET状态,PUT和DELETE同样。

REST可以使用SOAP web服务,因为它是一个概念,可以使用任何协议,如HTTP、SOAP。SOAP使用服务接口公开业务逻辑。REST使用URI公开业务逻辑。

没有HATEOAS,休息就不是休息。这意味着客户端只知道入口点URI,资源应该返回客户端应该遵循的链接。那些花哨的文档生成器为您在REST API中可以做的所有事情提供URI模式,它们完全忽略了这一点。他们不仅记录应该遵循标准的东西,而且当你这样做的时候,你把客户端耦合到API发展的一个特定时刻,API上的任何更改都必须被记录和应用,否则它就会崩溃。

HATEOAS是Hypermedia As The Engine Of Application State的缩写,是REST应用程序体系结构的一个约束,它区别于大多数其他网络应用程序体系结构。其原理是客户端完全通过应用服务器动态提供的超媒体与网络应用程序进行交互。REST客户端不需要预先了解如何与任何特定的应用程序或服务器交互,只需要对超媒体有一般的理解。相反,在一些面向服务的体系结构(SOA)中,客户机和服务器通过文档或接口描述语言(IDL)共享的固定接口进行交互。

参考1 参考2