REST是更好的Web服务方法还是SOAP?或者它们是针对不同问题的不同工具?或者这是一个微妙的问题——也就是说,一个人在某些领域比另一个人稍微好一点,等等?

我尤其希望了解这些概念以及它们与php世界以及现代高端网络应用程序的关系。


当前回答

这是个好问题……我不想让你误入歧途,所以我和你一样愿意接受别人的答案。对我来说,这实际上归结于开销成本和API的使用。在创建客户端软件时,我更喜欢使用web服务,但是我不喜欢SOAP的重量。我相信REST的重量更轻,但我不太喜欢从客户的角度使用它。

我很好奇别人是怎么想的。

其他回答

我建议您先使用REST——如果您正在使用Java,请查看JAX-RS和Jersey实现。REST更简单,易于在多种语言中进行互操作。

正如其他人在这篇文章中所说,SOAP的问题在于当其他WS-*规范加入时它的复杂性,如果您误入WSDL、xsd、SOAP、WS- addressing等的错误部分,就会出现无数的互操作问题。

判断REST和SOAP之争的最好方法是看看互联网——几乎所有网络领域的大玩家,谷歌、amazon、ebay、twitter等——都倾向于使用并偏爱RESTful api而不是SOAP api。

使用REST的另一个很好的方法是,你可以在web应用程序和REST前端之间重用大量的代码和基础设施。例如,使用JAX-RS和隐式视图等框架,将资源的HTML、XML和JSON呈现出来通常是非常容易的,而且使用web浏览器也很容易处理RESTful资源

SOAP目前具有更好的工具的优势,它们可以为服务层生成大量样板代码,也可以从任何给定的WSDL生成客户端。

REST更简单,因此更容易维护,位于Web体系结构的核心,允许更好的协议可见性,并且已被证明可以扩展到WWW本身的大小。有些框架可以帮助您构建REST服务,如Ruby on Rails,有些甚至可以帮助您编写客户端,如ADO。NET数据服务。但在大多数情况下,缺乏工具支持。

回答2012年刷新的问题(通过第二个赏金),并回顾今天的结果(其他答案)。


SOAP的利弊

关于SOAP 1.2,与“REST”相比的优点和缺点…从2007年开始 你可以用WSDL描述REST Web服务, 并使用SOAP协议…也就是说,如果您再努力一点,web服务协议栈的所有W3C标准都可以是REST!

这是一个很好的起点,因为我们可以想象一个场景,在这个场景中,所有的哲学和方法论讨论都暂时被避免了。我们可以在技术上比较类似服务中的“SOAP-REST”和“非SOAP-REST”,

SOAP-REST (="REST-SOAP"): as showed by L.Mandel, WSDL2 can describe a REST webservice, and, if we suppose that exemplified XML can be enveloped in SOAP, all the implementation will be "SOAP-REST". NON-SOAP-REST: any REST web service that can not be SOAP... That is, "90%" of the well-knowed REST examples. Some not use XML (ex. typical AJAX RESTs use JSON instead), some use another XML strucutures, without the SOAP headers or rules. PS: to avoid informality, we can suppose REST level 2 in the comparisons.

当然,为了从概念上进行比较,可以将“NON-REST-SOAP”与“NON-SOAP-REST”作为不同的建模方法进行比较。那么,完成这个web服务分类:

NON-REST-SOAP:任何不能是REST的SOAP web服务…也就是说,“90%”的广为人知的SOAP示例。 NON-REST-NEITHER-SOAP:是的,“web服务建模”的世界包括其他东西(例如XML-RPC)。

REST条件下的SOAP

比较可比较的事物:皂歇和非皂歇。

PROS

解释一些术语,

Contractual stability: for all kinds of contracts (as "written agreements"), By the use of standars: all levels of the W3C stack are mutually compliant. REST, by other hand, is not a W3C or ISO standard, and have no normatized details about service's peripherals. So, as I, @DaveWoldrich(20 votes), @cynicalman(5), @Exitos(0) said before, in a context where are NEED FOR STANDARDS, you need SOAP. By the use of best practices: the "verbose aspect" of the W3C stack implementations, translates relevant human/legal/juridic agreements. Robustness: the safety of SOAP structure and headers. With metada communication (with the full expressiveness of XML) and verification you have an "insurance policy" against any changes or noise. SOAP have "transactional reliability (...) deal with communication failures. SOAP has more controls around retry logic and thus can provide more end-to-end reliability and service guarantees", E. Terman.

按受欢迎程度排序,

更好的工具(~70票):从2007年到2012年,SOAP目前拥有更好的工具的优势,因为它是一个定义良好且被广泛接受的标准。参见@MarkCidade(27票),@DaveWoldrich(20票),@JoshM(13票),@TravisHeseman(9票)。 标准遵从性(25票):正如我,@DaveWoldrich(20票),@愤世嫉俗的人(5票),@Exitos(0票)之前所说,在需要标准的上下文中,您需要SOAP。 健壮性:SOAP头的保险,@JohnSaunders(8票)。

CONS

SOAP strucuture is more complex (more than 300 votes): all answers here, and sources about "SOAP vs REST", manifest some degree of dislike with SOAP's redundancy and complexity. This is a natural consequence of the requirements for formal verification (see below), and for robustness (see above). "REST NON-SOAP" (and XML-RPC, the SOAP originator) can be more simple and informal. The "only XML" restriction is a performance obstacle when using tiny services (~50 votes): see json.org/xml and this question, or this other one. This point is showed by @toluju(41), and others. PS: as JSON is not a IETF standard, but we can consider a de facto standard for web software community.


使用SOAP对服务建模

现在,我们可以添加SOAP- non - rest与非SOAP- rest比较,并解释什么时候使用SOAP更好:

Need for standards and stable contracts (see "PROS" section). PS: see a typical "B2B need for standards" described by @saille. Need for tools (see "PROS" section). PS: standards, and the existence of formal verifications (see bellow), are important issues for the tools automation. Parallel heavy processing (see "Context/Foundations" section below): with bigger and/or slower processes, no matter with a bit more complexity of SOAP, reliability and stability are the best investments. Need more security: when more than HTTPS is required, and you really need additional features for protection, SOAP is a better choice (see @Bell, 32 votes). "Sending the message along a path more complicated than request/response or over a transport that does not involve HTTP", S. Seely. XML is a core issue, offering standards for XML Encryption, XML Signature, and XML Canonicalization, and, only with SOAP you can to embed these mechanisms into a message by a well-accepted standard as WS-Security. Need more flexibility (less restrictions): SOAP not need exact correspondence with an URI; not nedd restrict to HTTP; not need to restrict to 4 verbs. As @TravisHeseman (9 votes) says, if you wanted something "flexible for an arbitrary number of client technologies and uses", use SOAP.PS: remember that XML is more universal/expressive than JSON (et al). Need for formal verifications: important to understand that W3C stack uses formal methods, and REST is more informal. Your WSDL (a formal language) service description is a formal specification of your web services interfaces, and SOAP is a robust protocol that accept all possible WSDL prescriptions.

上下文

历史

要判断趋势,必须有历史的眼光。对于这个问题,10年或15年的展望……

在W3C标准化之前,有一些混乱。很难用不同的框架实现可互操作的服务,而在公司之间实现一些可互操作的东西则更加困难、昂贵和耗时。 W3C堆栈标准一直是复杂web服务集互操作的明灯。

对于日常的任务,比如实现AJAX, SOAP很繁重……因此,需要简单的方法,需要选择一个新的理论框架…而大的“网络软件玩家”,如谷歌、亚马逊、雅虎等,选出了最佳的替代方案,那就是REST方法。在这种情况下,REST概念作为一个“竞争性框架”出现了,并且,今天(2012年),这个替代方案已经成为程序员的事实上的标准。

基金会

在并行计算环境下,web服务提供并行子任务;和协议,如SOAP,确保良好的同步和通信。不是“任何任务”:web服务可以被分类为 粗粒度和令人尴尬的并行。

随着任务变得越来越大,“复杂性争论”变得不那么重要,而与通信的稳健性和合同的稳固性更加相关。

一个快速点传输协议和编制;

出于速度、可靠性和安全性的考虑,我在TCP上使用SOAP,包括编排的机器对机器服务(ESB)和外部服务。更改服务定义,业务流程会从WSDL更改中引发一个错误,并且它会立即显现出来,并且可以重新构建/部署。

不确定你可以用REST做同样的事情-我等待被纠正或课程! 使用REST,更改服务定义—在返回400(或其他值)之前,没有人知道它。

REST是Roy Fielding发明的一种架构,并在他的论文《架构风格和基于网络的软件架构设计》中进行了描述。Roy也是HTTP协议的主要作者,该协议定义了在万维网上的文档传输。HTTP是RESTful协议。当开发人员谈论“使用REST Web服务”时,可能更准确的说法是“使用HTTP”。

SOAP是一种基于xml的协议,它在HTTP请求/响应中进行隧道传输,因此即使您使用SOAP,您也在使用REST。关于SOAP是否为基本HTTP添加了任何重要的功能存在一些争论。

在创建Web服务之前,我建议学习HTTP。很可能您的需求可以使用规范中已经定义的功能实现,因此不需要其他协议。