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

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


当前回答

有一件事没有提到,SOAP信封既可以包含头部,也可以包含主体部分。这使您可以使用XML的完整表达来发送和接收带外信息。据我所知,REST限制你使用HTTP头和结果代码。

(哦,你可以使用cookie和REST服务一起发送“头”类型的带外数据吗?)

其他回答

当我在惠普工作时,我根据开发中的原始规范构建了第一批SOAP服务器之一,包括代码生成和WSDL生成。我不建议在任何事情上使用SOAP。

首字母缩写“SOAP”是一个谎言。它不是简单的,它不是面向对象的,它没有定义访问规则。可以说,它是一项议定书。这是Don Box有史以来最糟糕的规格,这是一个相当了不起的壮举,因为他是“COM”的创造者。

SOAP中没有什么有用的东西是REST不能用于传输的,JSON、XML甚至纯文本不能用于数据表示的。为了传输安全,可以使用https协议。对于认证,使用基本认证。对于会话,有cookie。REST版本将更简单、更清晰、运行更快、使用更少的带宽。

XML-RPC清楚地定义了请求、响应和错误协议,并且对于大多数语言都有很好的库。但是,对于许多任务来说,XML比您所需要的要重。

不要忽视XML-RPC。如果您只是追求一个轻量级的解决方案,那么对于一个可以在几页文本中定义并在最少的代码中实现的协议来说,有很多事情要做。XML-RPC已经存在了多年,但已经过时了一段时间——但是极简主义的吸引力似乎使它在最近得到了某种复兴。

我的一般规则是,如果你想要一个浏览器web客户端直接连接到一个服务,那么你可能应该使用REST。如果希望在后端服务之间传递结构化数据,则使用SOAP。

SOAP的设置有时真的很痛苦,对于简单的web客户端和服务器数据交换来说,它通常是多余的。不幸的是,我所见过(并从中学到)的大多数简单编程示例都在某种程度上强化了这种看法。

That said, SOAP really shines when you start combining multiple SOAP services together as part of a larger process driven by a data workflow (think enterprise software). This is something that many of the SOAP programming examples fail to convey because a simple SOAP operation to do something, like fetch the price of a stock, is generally overcomplicated for what it does by itself unless it is presented in the context of providing a machine readable API detailing specific functions with set data formats for inputs and outputs that is, in turn, scripted by a larger process.

在某种程度上,这是可悲的,因为它确实给SOAP带来了坏名声,因为如果不在最终产品如何使用的完整上下文中展示它,就很难展示SOAP的优点。

我建议您先使用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资源

REST是一个体系结构,SOAP是一个协议。

这是第一个问题。

您可以在REST应用程序中发送SOAP信封。

SOAP本身实际上是相当基本和简单的,它之上的WSS-*标准使它非常复杂。

如果您的消费者是其他应用程序和其他服务器,那么目前对SOAP协议有很多支持,在现代ide中移动数据的基本操作基本上就是单击鼠标。

如果您的消费者更有可能是ria或Ajax客户端,那么您可能希望使用比SOAP更简单、更适合客户端的东西(特别是JSON)。

通过HTTP发送的JSON包不一定是REST体系结构,它只是发送到url的消息。所有这些都是完全可行的,但是REST习惯用法有一些关键组件。然而,这两者很容易混淆。但是,仅仅因为您谈论的是HTTP请求,并不一定意味着您拥有REST体系结构。您可以有一个完全没有HTTP的REST应用程序(注意,这种情况很少见)。

因此,如果您的服务器和消费者对SOAP“满意”,SOAP和WSS堆栈就可以很好地为您服务。如果你在做一些特别的事情,想要更好地与web浏览器交互,那么一些轻量级的HTTP协议也可以很好地工作。