Rest 为什么肥皂可以';不要使用HTTP缓存机制

Rest 为什么肥皂可以';不要使用HTTP缓存机制,rest,soap,http-caching,Rest,Soap,Http Caching,我正在从SOAP过渡到REST,我想让我的同事相信这是一个好的举措。我们不需要SOAP能够提供的额外安全机制。对我们来说,SOAP和WSDL的开销多年来只是一个令人头痛的问题 除了明显的简化之外,我们系统的一个真正有价值的优势是HTTP缓存机制。我读过关于这个主题的文章,但我仍然不完全理解为什么这些缓存机制不能应用于SOAP消息 这仅仅是因为REST按约定编码url中的所有参数吗?由于GET调用也可以有一个带有参数的主体,我知道它不受REST的限制,但是如果这样做,缓存机制就不起作用了?当使用H

我正在从SOAP过渡到REST,我想让我的同事相信这是一个好的举措。我们不需要SOAP能够提供的额外安全机制。对我们来说,SOAP和WSDL的开销多年来只是一个令人头痛的问题

除了明显的简化之外,我们系统的一个真正有价值的优势是HTTP缓存机制。我读过关于这个主题的文章,但我仍然不完全理解为什么这些缓存机制不能应用于SOAP消息


这仅仅是因为REST按约定编码url中的所有参数吗?由于GET调用也可以有一个带有参数的主体,我知道它不受REST的限制,但是如果这样做,缓存机制就不起作用了?

当使用HTTP作为传输机制时,SOAP是通过HTTP POST请求发送的。由于HTTP POST是非幂等的,因此它不会缓存在HTTP级别

REST可以缓存,前提是所讨论的请求是幂等的:GET、PUT和(理论上)DELETE。仍然不会缓存任何POST请求。这就是说,如果您打算用它做大量工作,您应该研究缓存如何检查它们是否仍然有效。特别是,如果您有一种廉价的方法来计算值应该是什么,那么将是实现缓存的一种好方法

这仅仅是因为REST按约定编码url中的所有参数吗?由于GET调用也可以有一个带有参数的主体,我知道它不受REST的限制,但是如果这样做,缓存机制就不起作用了

REST没有规定如何在URL中编码请求参数的任何特定机制。建议客户机永远不要进行任何URL合成:让服务器进行所有URL创建(通过您想要的任何机制,例如嵌入路径或作为查询参数)。您绝对不应该做的是让客户端向服务器发送一个主体!任何缓存都可能会丢失它。相反,当该请求与某个资源的简单获取不对应时,您可以将该复杂文档发布或放置到服务器,并作为单独的阶段获取操作结果


将操作结果作为另一个复杂文档返回的复杂文档的POST与SOAP的编码方式基本相同。如果您想这样做,您不妨直接使用SOAP,因为它在许多语言中都有更成熟的工具。如果您想以这种方式运行REST,您可能在某个地方做错了…

说POST请求通常是非幂等的是不正确的。POST应该用于非幂等操作,但SOAP并没有真正正确地使用HTTP,因此可能会发生这种情况,POST用于幂等操作——例如,通过ID获取实体(通常使用GET)


同样根据这一点:(检查重启的答案),POST请求可以根据RFC进行缓存。不过,浏览器和代理可能无法很好地实现它。无论如何,如果您添加适当的HTTP头,SOAP over HTTP消息应该可以使用HTTP缓存机制进行缓存。

另一个原因可能是SOAP URI始终是SOAP服务器,它不确定需要缓存哪些资源或资源是什么。所以缓存服务器无法对它不知道的内容执行缓存。不过,REST对每个资源都有URI(可以是同一资源的多个URI),这有助于缓存服务器执行其任务


除此之外,正如其他答案中所提到的,只有一些HTTP动词用于缓存,如GET、PUT等(主要是GET)。

好的,SOAP只是一种通信协议,而不是实际的产品/软件。所以这个问题有点没有意义。。。您需要澄清您谈论的是哪种SOAP实现/产品……对于服务器,我们使用ApacheCXF For Java,使用NodeJS节点SOAP模块For javascript。我说的是HTTP缓存,而不是应用程序缓存…SOAP使用HTTP,因为我们正在与浏览器客户端进行对话。谢谢Donal,我现在了解它的工作原理,谢谢你的链接。我的大多数api都是简单的GET,我不需要传递正文中编码的参数。我很困惑,因为它是允许的,然后它看起来很像http上的SOAP。我现在明白了,我绝对应该避免这样做。我不同意SOAP在许多语言中都有非常成熟的工具。我尝试使用Javascript和Lua中的soap与Java服务器进行对话。Java有成熟的工具,但随着时间的推移,它们甚至改变了它们的严格程度,对CXF的更新一度中断了与其他客户机的通信,这些客户机做的事情略有不同。那些其他库通常由一个或几个只部分支持该规范的人维护,为了更好地使用CXF,我不得不对它们进行破解。对于我们所做的基本工作来说,SOAP是一个非常令人头痛的问题。REST为我简化了很多事情,我很高兴我可以继续:)@0x80 JS是最差的SOAP工具之一;许多语言都有更丰富的工具链。它们之所以会出现,是因为它们被用于公司代码(和消息总线等),所以人们已经支付了开发工具的费用。JS在后端的使用相对较少(相比之下,node.JS是相当新的),因此它没有被推到那个方向。(我不知道在Lua有很多人在做复杂的Web编程,但我希望有人使用C++ SOAP绑定,并把它们映射到LUA作为扩展库。)你可能是对的。我的经验来自这两种语言,它们都有糟糕的soap工具。但我也对CXF如何随时间改变其行为感到惊讶。对我们来说,SOAP不是一个好的选择,因为我们的客户端现在都是JS,我们不需要额外的安全性。能够使用JSON而不是XML也是一个挑战