RESTful Web服务相较于基于SOAP的Web服务有何优势?

9

我看过各种网站,它们提供的唯一答案是:Restful Web服务使用Http自己的方法,如(GET、POST、PUT、DELETE)...而SOAP基础Web服务使用自己的自定义方法。

然而,我不理解这些答案的全部意义。为什么这些东西证明自己比基于SOAP的Web服务有如此大的优势?

下面是一个例子:


可能是重复的问题:https://dev59.com/-nVD5IYBdhLWcg3wI36L - michid
你有什么想法吗?你有4个非常好的答案。 - RPM1984
@RPM1984:是的,我想我会选择REST,因为它针对不同服务具有独特的URL,使其非常松散耦合,并且具有类似目录的URL结构(不像SOAP具有“www.somesite.com?query=something”),这使得它更加友好于搜索引擎。 :) - Anand
4个回答

10

REST天然适用于Web/云API,而SOAP适用于分布式计算场景。

REST的主要优点是带宽利用率高,因为没有复杂的文档要遍历(例如XML、SOAP头),这对于性能良好的Web API非常重要。 JSON是一种广泛认可和简单的数据交换标准,易于浏览器和客户端代码读取,这就是为什么大多数RESTful API(例如雅虎)提供JSON的原因。

更不用说REST可用于XmlHttpRequest对象,这对于Web API的AJAX非常重要。

当然,REST的可缓存特性也不能被忽视。由于REST基于HTTP,它可以利用HTTP数据包的许多语义(以及Web本身),通过在HTTP数据包的标头中使用(过期)来使浏览器进行缓存。还有像gzip压缩等方式可以提高效率。从性能方面来看,REST相对于SOAP表现得更好。

至于SOAP,它适用于有状态操作。WS*标准(安全性、事务等)处理在分布式情况下比较常见的此类底层功能。当然,REST也可以实现,但那就不是真正的REST了。 SOAP非常适合定义客户端和服务器之间的操作契约,这在分布式场景中至关重要。

因此,我的观点是(SOAP vs REST的问题高度主观),对于分布式计算场景使用SOAP,对于Web API使用REST。


@RPM1984:你所说的“REST的可缓存性特性”是什么意思? - Cratylus
@user384706 - 因为REST基于HTTP,它允许在响应中添加缓存头(过期时间),以便浏览器可以缓存它们。响应数据包明确指出了可缓存性。现在这是客户端缓存,不要与服务器缓存混淆。这也是我主帖中提到的REST用于Web,SOAP用于分布式计算的原因。 - RPM1984
我使用REST进行分布式计算。它非常适用于各种场景。 - Darrel Miller
1
@RPM1984:好的,但为什么这只适用于REST?SOAP消息也通过HTTP传输。如果消息是SOAP的话,缓存也可以应用,对吧? - Cratylus
@user384706 - 你是正确的,但一般来说,通过HTTP的SOAP调用是使用HTTP POST方法触发的,这应该不会被缓存(虽然可以缓存,但不建议这样做)。 - RPM1984
2
@Darrel Miller - 这就是为什么我最后一段有“所以我的观点”的警告。:) REST vs SOAP 是一个非常有争议的话题。我曾在一些公司工作,这些公司的后端系统与其他15个以上的系统集成。他们选择了SOAP,因为最重要的是操作合同/安全性,而不是性能/可扩展性。正如我所说,这只是我的意见/经验。我自己是一个RESTful小男孩。 :) - RPM1984

4
SOAP的主要问题是膨胀。你所能做的越多,你就越不能使用默认值。即使是简单的方法,这也会导致 huge WSDL downloads。其次,它使解析器变得膨胀(特定的解析器总是比通用的更小),消息变得臃肿(整个 XML 的一大堆,而不是 DELETE with a URI),错误处理程序变得膨胀(你向服务器发送 20-30KB 的 XML,它回复一个 50KB 的错误消息;祝好运阅读和理解)。
具体例子:通过SOAP从SharePoint服务器读取文档列表的Java代码非常庞大,你需要为Java编译器提供1GB的RAM才能进行编译。
Restful同样只需要几行代码。在客户端,你需要构建一个请求与 GET list/some/url。在服务器上解析它将比编写WSDL更容易,即使你必须手动编写代码。

2
听起来,你对一个框架有着非常糟糕的经历。相比REST,SOAP通常需要更少的手动编码才能开始工作,因为框架通常会自动化大部分的管道工作。WSDL的大小对运行时性能应该是无关紧要的,因为它只用于帮助客户端代理生成。 - Darrel Miller
1
我使用了Axis。Java上还有其他的东西吗?另外,WSDL的大小很重要,因为大的WSDL意味着大的请求。 - Aaron Digulla

2
许多人对基于SOAP的Web服务表示不满,因为SOAP层增加了额外的复杂性,被认为是不必要的开销,提出了RESTful Web服务的建议。
在REST框架中,XML消息直接封装在HTTP有效负载中,而不是在SOAP信封中(与AJAX相同)。
这显著降低了解析开销。
但在实际情况下,通常需要向服务器/客户端发送与实际XML消息有效负载无关的额外信息。
这导致需要通过HTTP消息传输信息的方法。
由于存在传输此类信息的需求,一些人反驳说,基于SOAP的服务有助于满足这些需求。

1

优势是战术性的 - 当然可以在另一个中做所有你可以在其中做的事情,但是Web服务器比SOAP先出现,并且相当容易配置,因此通常更简单。例如,身份验证等通常可以由Web服务器处理,重定向和负载平衡等也可以。普通的SOAP框架实际上没有完整的这些功能集,可能会导致成长痛苦。


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