选择将Web服务公开为SOAP或REST服务的决定因素是什么?


30

据我所知,使用SOAP需要使用SOAP堆栈,因此客户端很难使用,即他们需要确保已拥有适当的SOAP堆栈来正确格式化POST数据和标头,然后为您提供一些数据结构,而使用REST,您只需使用查询字符串中的参数发出HTTP GET请求,然后获取一些我想可能是XML的文本。

那么,SOAP的额外开销/复杂性会给您带来什么呢?什么时候需要它?什么时候可以?

Answers:


17

我之前已经实现了REST API,我真的很喜欢它。通常,当您在SOAP上实现REST时,您的客户端/服务器更加正交,这意味着您可以更自由地更改服务器,而不会影响您的客户端。这种正交性归因于通过HTTP动词使用了更加抽象且已经定义明确的通信。同样,使用REST响应中嵌入的超链接,可以相对轻松地扩展和扩展API。客户应该遵循这些嵌入式链接来获取新资源,就像人类将遵循网页上的链接以“向下钻取”以获得更多信息一样。

如此说来,我有一些同事被告知必须使用SOAP,并且他们一直抱怨着它。因此,我更详细地研究了两者。

总的来说,我发现当您有成千上万的客户端时,REST非常适合于高度分布式的应用程序。一个原因是上述正交性,另一个是由于使用HTTP而免费获得了缓存。

当您需要一个或两个较小的客户端API且您不太担心可伸缩性时,SOAP可能是最快的方法。如果您没有基于资源构建的体系结构,那么它也可能更适合您,因为它可能需要一些时间来重新构建应用程序,甚至无法实现REST。


2
您获得缓存的原因是资源范例和缺乏状态,而不是因为HTTP。
Dietbuddha 2011年

@dietbuddha HTTP确实为您提供了免费的实现。
Jacob Raihle '17

17

这可能只是次要的一点,但是REST完全基于HTTP。

SOAP不需要HTTP,您可以随意使用任何您喜欢的传输方式。

SOAP消息可以异步可靠地路由,而REST几乎是同步范例。

REST不会告诉您有关发送和接收的数据的外观的任何信息。有WADL,但大多数情况下您依赖于正确的API文档。SOAP具有XML技术的马戏团,可以使数据描述不易出错。WSDL,架构...

归根结底,REST基本上可以为您提供基于HTTP的文件系统。如果您的系统可以适应该范式-那么它可能是一个不错的选择。


+1用于提及多种运输方式。如果您确实需要与传输无关的协议(例如,该协议支持通过SMTP或类似方法进行的操作),那么REST就可以了。通常,HTTP足够好,但是……
sleske 2012年

6
我看不到REST如何与HTTP绑定吗?这是实现细节。大多数REST实现都是通过HTTP进行的,但是我不明白为什么我不能通过其他协议(例如FTP)来实现REST。
edalorzo 2015年

REST不会将通信限制为特定的协议,请参考:ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
nmtoken

7

那么,SOAP的额外开销/复杂性会给您带来什么呢?什么时候需要它?什么时候可以?

两者之间的最大区别是,REST被假定为无状态的,而SOAP不是。实际上,许多REST实现实际上通过OAuth之类的方法在会话中实现了某些状态。

REST的另一个不同之处是它非常“资源化”或面向名词。您通过CRUD操作与资源进行交互。任何不适合该范式的事物都会变得笨拙而笨拙。

另一方面,SOAP只是RPC(远程过程调用)协议。它没有范式,只是传输层。


1
SOAP和REST都是达到最终结果的手段。它们可能适合或可能不适合该任务。因此,REST也可以看作是传输层。甚至状态/较少视图也不成立:您可以同时使用-和其他-类型的API设计两种口味。您甚至可以使用双重API,该API同时具有SOAP和REST端点。还有一个XML-RPC端点。还有一个Apache Thrift端点。还有一个Google Protocol Buffers端点。还有什么。归根结底,一切都只是一个RPC。
JensG


4

我要提到的一件事是互操作性-如果要从用.NET编写的应用程序调用服务,而服务器是用Java(或任何其他组合)编写的,则可以使用REST。我已经看到SOAP实现之间存在太多细微的不兼容,以至于不再考虑它了。


2
同意。SOAP是行业标准,但过于复杂,导致大量的实现不完整或不完整。最重要的是,与其他方法相比,SOAP在性能和流量方面通常具有最大的占用空间。
JensG

1

如果您只需要一个简单的可视化指南来帮助您根据应用程序需求来测量SOAP和REST ...

Vijay Prasad Gupta整理了一个简单而有用的流程图。

流程图的直接链接:https : //drive.google.com/file/d/0B3zMtAq1Rf-sdVFNdThvNmZWRGc/edit

链接到文章:https : //www.linkedin.com/pulse/20140818062318-7933571-soap-vs-rest-flowchart-to-determine-the-right-web-services-protocol-for-your-needs


这实际上是一个相当不错的流程图。令我惊讶的是,这里没有一个答案能解决SOAP与REST相比的优势。该流程图可以。我想我可以在这里将流程图作为图像包括在内,而不是链接到该图像,只是为了确保它符合答案?
jleach

-2

现在是2015年。我本来希望SOAP到现在已经死了,但是它仍然像难闻的气味一样挥之不去。对于除了最基本的“示例”应用程序之外的任何事情,与SOAP服务集成都充满了挑战。它是一个复杂的体系结构,在多个级别上具有许多选择,并结合了多种实现的怪癖和细微(而不是细微)的不兼容性。我从来没有一个很好的经验。另一方面,REST轻而易举:每个人都了解HTTP。在大多数情况下,JSON比XML InfoSet具有更多的实用性。

为了让您了解SOAP的复杂性,请尝试将SOAP库集成到您的项目中。对于Java,最基本的Apache Axis2客户端(使用简单的ADB数据绑定)引入了23个新的JAR。二十三!20MB的库膨胀。CXF与之类似:我上次计算时为21罐。

如果确实需要,可以使用简单的HTTP库进行REST。


1
这读起来更像是在胡说八道,看如何回答
蚊蚋

你是对的。抱歉,我当时在肥皂汤里泛滥:D
Cornel Masson 2015年

1
上世纪90年代,我们对CORBA / IDL提出了同样的投诉。然后突然“简单对象访问协议” ..它将很简单!太酷了!会很快。十年后,它被认为太复杂了。随之而来的是JSON(IMAO确实是学生实验室设置中数据传输操作的方形轮子,或者受限制的“我知道我在做什么”的快速修复情况)和RESTful操作。冲洗,重复...
David Tonhofer,2016年

恐怕每一个关于SOAP的真实陈述都必须读得一无所有。它是设计性的企业级产品,可为您提供大量选择,您只需要将它们发送一些数据即可。关于我使用过的几个SOAP接口,每个接口都是一个高度冗余的混乱(并非完全是SOAP的错,但是对SOAP的亲和力与对膨胀软件的亲和力相关)。很抱歉。
maaartinus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.