REST与SOAP可演化性

REST与SOAP可演化性,rest,soap,rpc,Rest,Soap,Rpc,我得到了更改链接URI的好处,但这并不是这个问题的真正含义 我所说的可进化性是指向服务添加新功能或修改(如果可能)现有功能,实际上就是这样 当涉及到可进化性时,SOAP并没有REST社区倾向于谈论的那么糟糕。例如: 在REST中,我们可以添加新的rel-In SOAP,我们可以添加新的方法。二者都 各种类型的旧客户端将继续使用新服务 在REST中,我们可以添加新的表单字段并在中设置其默认值 SOAP我们可以将服务参数作为一些ServiceArgs类和 将新字段添加到ServiceArgs。这很难

我得到了更改链接URI的好处,但这并不是这个问题的真正含义

我所说的可进化性是指向服务添加新功能或修改(如果可能)现有功能,实际上就是这样

当涉及到可进化性时,SOAP并没有REST社区倾向于谈论的那么糟糕。例如:

  • 在REST中,我们可以添加新的rel-In SOAP,我们可以添加新的方法。二者都 各种类型的旧客户端将继续使用新服务
  • 在REST中,我们可以添加新的表单字段并在中设置其默认值 SOAP我们可以将服务参数作为一些ServiceArgs类和 将新字段添加到ServiceArgs。这很难看,但它很管用
  • 当SOAP客户机崩溃而您对此无能为力,而REST客户机正在优雅地处理这种情况时,有哪些可进化性示例


    谢谢

    SOAP是一种基于契约的技术。整个客户机/服务器交互都写在一个大文档(WSDL
    WSDL
    )中,并且必须得到双方的同意和尊重,才能使事情顺利进行。如果任何一方决定添加功能,另一方必须与之同步“发展”。双方完全结合在一起,臀部相连,胶合在一起,永远结婚

    增强SOAP服务的典型方法是为服务的新版本创建新的WSDL文档,同时维护旧版本。另一种技术是创建一个新接口来包含新方法并继承旧方法。您在#1中描述的方法违反了SOAP规则,因为客户机和服务器现在将使用不同的契约,而且它只会起作用,因为可添加的更改(如新方法)可以顺利进行,并且大多数情况下都会起作用。一旦有人做出了破坏性的改变,那么客户端的合同将与服务器的合同不匹配,游戏就结束了。这是一个难以管理的过程,这就是为什么大多数组织选择为每个新版本的API创建全新的WSDL

    REST并不能神奇地消除所有这些问题,但它不强迫您将整个分布式系统的“契约”捆绑到一个工件中,从而使事情更易于管理。你在使用HTTP吗?很好,然后你就可以使用web使用的所有精彩的HTTP功能:代理服务器、URL、内容协商、身份验证等等。你想使用JSON编码和XML进行通信吗?把你自己弄昏。在不影响现有客户机的情况下,在REST中随时进行这项工作是微不足道的。你想要安全?很好,开始挑战使用HTTP的内置支持进行身份验证的凭据。所有这些东西(HTTP、JSON等)都在不同的地方进行了标准化和描述,这正是它应该做到的

    SOAP将传输协议、位置信息、有效负载描述、编码选择和RPC方法组合到一个巨大的文档中。如果您想对该列表中的任何内容进行任何更改,则需要一个新文档。更糟糕的是,有些事情根本无法改变

    REST将这些东西分离出来,以便片段能够独立地演化。您的URL(或者更准确地说是“URI”)在运行时返回,并且假设客户端是可演化的,而不需要对客户端进行任何更改。如果您的文档明确说明将来可能会出现新字段,那么对媒体类型的附加更改是微不足道的。您还可以选择对媒体类型进行版本控制,允许v1/v2/v3共存。。。系统中的媒体类型,客户端可以选择(使用HTTP中的
    Accept
    Content-Type
    标题)要使用的媒体类型


    有没有听过一个关于保时捷车主的笑话,每当烟灰缸装满时,他就会买一辆全新的汽车?那是肥皂。一个微不足道的变化需要一次大的检修。其余的给你真空吸尘器。您不必使用它,但它确实更便宜。

    谢谢您提供的详细答案。显然,SOAP服务不如RESTful服务那么具有进化性。然而,SOAP允许一定程度的可进化性。您不能更改格式和其他一些内容,但可以添加方法和参数(使用上面描述的小技巧)。正如您所说,这将违反SOAP规则,但这有关系吗?它起作用了。你还说,当某人对SOAP服务进行破坏性的更改时,游戏就结束了。对于RESTful服务也是如此。如果您对媒体类型进行了破坏性的更改,而客户机找不到链接,那么它也会希望找到链接。Re:向SOAP接口添加方法(“技巧”):是的,它可以工作,但它工作是因为运气,而不是设计。它本质上是一种不受支持的技术。有了REST,您的体系结构可以进化,因为进化是REST的核心,而不是像SOAP那样在基本级别上被禁止。回复:破坏性变更-两种情况下均正确。这不是任何编程客户端都能神奇地处理的事情。