据我所知,使用SOAP需要使用SOAP堆栈,因此客户端很难使用,即他们需要确保已拥有适当的SOAP堆栈来正确格式化POST数据和标头,然后为您提供一些数据结构,而使用REST,您只需使用查询字符串中的参数发出HTTP GET请求,然后获取一些我想可能是XML的文本。
那么,SOAP的额外开销/复杂性会给您带来什么呢?什么时候需要它?什么时候可以?
据我所知,使用SOAP需要使用SOAP堆栈,因此客户端很难使用,即他们需要确保已拥有适当的SOAP堆栈来正确格式化POST数据和标头,然后为您提供一些数据结构,而使用REST,您只需使用查询字符串中的参数发出HTTP GET请求,然后获取一些我想可能是XML的文本。
那么,SOAP的额外开销/复杂性会给您带来什么呢?什么时候需要它?什么时候可以?
Answers:
我之前已经实现了REST API,我真的很喜欢它。通常,当您在SOAP上实现REST时,您的客户端/服务器更加正交,这意味着您可以更自由地更改服务器,而不会影响您的客户端。这种正交性归因于通过HTTP动词使用了更加抽象且已经定义明确的通信。同样,使用REST响应中嵌入的超链接,可以相对轻松地扩展和扩展API。客户应该遵循这些嵌入式链接来获取新资源,就像人类将遵循网页上的链接以“向下钻取”以获得更多信息一样。
如此说来,我有一些同事被告知必须使用SOAP,并且他们一直抱怨着它。因此,我更详细地研究了两者。
总的来说,我发现当您有成千上万的客户端时,REST非常适合于高度分布式的应用程序。一个原因是上述正交性,另一个是由于使用HTTP而免费获得了缓存。
当您需要一个或两个较小的客户端API且您不太担心可伸缩性时,SOAP可能是最快的方法。如果您没有基于资源构建的体系结构,那么它也可能更适合您,因为它可能需要一些时间来重新构建应用程序,甚至无法实现REST。
这可能只是次要的一点,但是REST完全基于HTTP。
SOAP不需要HTTP,您可以随意使用任何您喜欢的传输方式。
SOAP消息可以异步可靠地路由,而REST几乎是同步范例。
REST不会告诉您有关发送和接收的数据的外观的任何信息。有WADL,但大多数情况下您依赖于正确的API文档。SOAP具有XML技术的马戏团,可以使数据描述不易出错。WSDL,架构...
归根结底,REST基本上可以为您提供基于HTTP的文件系统。如果您的系统可以适应该范式-那么它可能是一个不错的选择。
那么,SOAP的额外开销/复杂性会给您带来什么呢?什么时候需要它?什么时候可以?
两者之间的最大区别是,REST被假定为无状态的,而SOAP不是。实际上,许多REST实现实际上通过OAuth之类的方法在会话中实现了某些状态。
REST的另一个不同之处是它非常“资源化”或面向名词。您通过CRUD操作与资源进行交互。任何不适合该范式的事物都会变得笨拙而笨拙。
另一方面,SOAP只是RPC(远程过程调用)协议。它没有范式,只是传输层。
REST也使用post。实际上,使用REST时,http动词会告诉您正在进行的操作。
REST和SOAP是通过Internet传递数据的不同标准。
两者都使用过后,除非您知道将要使用Web服务的人都在使用.net和Visual Studio,否则我通常建议使用REST而不是SOAP。通常,使用.net VS可以更轻松地使用REST Web服务,而使用SOAP时,.net VS可以为您完成大部分工作。
如果您只需要一个简单的可视化指南来帮助您根据应用程序需求来测量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
现在是2015年。我本来希望SOAP到现在已经死了,但是它仍然像难闻的气味一样挥之不去。对于除了最基本的“示例”应用程序之外的任何事情,与SOAP服务集成都充满了挑战。它是一个复杂的体系结构,在多个级别上具有许多选择,并结合了多种实现的怪癖和细微(而不是细微)的不兼容性。我从来没有一个很好的经验。另一方面,REST轻而易举:每个人都了解HTTP。在大多数情况下,JSON比XML InfoSet具有更多的实用性。
为了让您了解SOAP的复杂性,请尝试将SOAP库集成到您的项目中。对于Java,最基本的Apache Axis2客户端(使用简单的ADB数据绑定)引入了23个新的JAR。二十三!20MB的库膨胀。CXF与之类似:我上次计算时为21罐。
如果确实需要,可以使用简单的HTTP库进行REST。