问题 为什么更喜欢REST而不是SOAP?


如果我需要一个Web服务来回传递一个复杂的对象,我是否应该选择SOAP over REST?以下是可能的SOAP消息的示例:

<soap:Envelope>
  <soap:Header>
    <Credentials>
      <User>Joe</User>
      <Password>abc123</Password>
    </Credentials>
  </soap:Header>
  <soap:Body>
    <MyComplexBusinessObject>
      <Search>
        <First>Joe</First>
        <Last>Smith</Last>
      </Search>
      ...
      ...
    </MyComplexBusinessObject>
  </soap:Body>
</soap:Envelope>

使用REST,我会要求客户端POST以下xml并使用基本身份验证进行身份验证:

<MyComplexBusinessObject>
  <Search>
    <First>Joe</First>
    <Last>Smith</Last>
  </Search>
  ...
  ...
</MyComplexBusinessObject>

SOAP消息稍微复杂一点,但不是很多。它们仍然是XML,但SOAP带有WSDL,大多数编程环境都会为您生成代理类。但是,与我交谈的大多数人都说我应该使用REST,因为它更容易使用。但我不知道SOAP如何更难使用。

我错过了什么吗?


3856
2017-11-24 11:57


起源

为何选择XML 一点都不 是重点。 JSON会更整洁(从编程角度来看)并且更紧凑。 [{'First':'Joe','Last':'Smith'},...] - Chris Morgan
你怎么会传递一个复杂的对象?当然我可以使用JSON,但这还不足以证明放弃SOAP for REST。该对象可能包含嵌套字段,可能无法很好地转换为URL。 - Books
实际上,对于这种情况,更好的匹配就是POST /search 使用标准POST变量; 1=Joe,Smith&2=John,Citizen&... 例如。如果你想要的不仅仅是搜索,那么你来错误的商店 - SOAP可能会把所有东西都放在一个URL上,但是REST不是那样的 - 每个东西都有一个URL(如果你可以做的话) /search/joe+smith 或类似的东西,它会更好)。 - Chris Morgan


答案:


您首次要求“来回传递复杂对象”会限制您的体系结构,以消除REST的许多好处。 SOAP是为访问远程对象而设计的,而REST则不是。 REST支持传递像text / plain这样简单的媒体类型,这比处理对象要简单得多。

如果你还没有看过, 这个 问题及其答案涵盖了大多数REST与SOAP问题。


9
2017-11-24 14:13



大多数RESTful服务可以被描述为“来回传递复杂对象”,即REpresentational State Transfer。几乎没有人使用它们 text/plain。 REST更面向文档,SOAP更像RPC。 - jfs
@ J.F.Sebastian声称是RESTful的大多数服务实际上都不是。在客户端和服务器之间传递对象意味着共享一种类型以及某些语义,这些语义未在消息中明确声明。这违反了REST的限制。 - Darrel Miller


REST的一个主要好处是,您需要调用和使用它的只是浏览器和HTTP堆栈 - 几乎每个设备和机器都有。因此,如果易用性和覆盖范围是您的主要目标 - 使用REST。

SOAP的一个主要好处是你有一个WSDL服务描述,你几乎可以自动发现服务,并从该服务描述生成一个可用的客户端代理(生成服务调用,方法的必要数据类型等等)向前)。

因此,如果可发现性和严格的正式服务描述对您来说更重要,请使用SOAP(缺点是您需要一个成熟的SOAP客户端来调用您的服务 - 您的Web浏览器是不够的)。

SOAP并不难使用 - 但它在可用性方面并不那么“普遍” - 任何浏览器都可以调用REST服务并获得答案 - 但是它需要解析并解释该响应。 SOAP获得了很好的数据结构,但是你需要一个SOAP客户端。


5
2017-11-24 12:06



但是你真的需要一个完整的SOAP客户端吗?我不能只是复制消息,填写空白,并将其发布到端点?这不会像REST客户端那样“相同”吗?我不是想让它听起来像是我反对REST - 我想要被说服。 - Books
@marc_s,“但是它需要解析和解释那个响应”,不会使用COD使用JavaScript来解决这个问题? - Anders
@Ashley:据我所知,如果你想与SOAP服务交谈,你需要一个SOAP客户端。我不认为你可以“只是POST”到那个URL(从来没有尝试过,无论如何) - marc_s
@Anders:也许,在某种程度上 - 但是REST服务(至少在今天)通常没有机器可发现的描述它在方法/ URL /数据方面提供的内容。你作为程序员需要 知道 不知何故,例如,通过阅读,理解和遵循一些文档。 - marc_s
@Darrel Miller:你有任何链接说明吗?有趣的是退房... - marc_s


我将SOAP和REST视为正交API,旨在执行不同的操作。

SOAP基本上是一个花哨的RPC,因此如果要将计算请求发送到服务器并获得结果,则使用SOAP。如果它是本地的,那么它将是对对象实例的方法调用。

REST是一种使用统一API创建,检索,更新和删除远程对象的方法,而不是POO意义上的方法。如果它是本地的,那就像使用文件一样。

所以他们实际上回应了不同的需求。你可以把一个人搞砸到另一个人的工作,但是你会破坏这个意义。


1
2018-04-10 20:07





如果您同时开发服务和客户端,使用SOAP就像REST一样简单(实际上更容易)。

如果满足以下条件,您可能更喜欢SOAP over REST:

  • 整个服务API很复杂,而不仅仅是一个对象。

  • 该服务在相对较小的网络中使用,性能不是重要的要求。

  • 您决定花费最少的时间来开发服务和API文档。


1
2018-04-20 11:21