9

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

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

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

4

3 回答 3

8

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

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

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

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

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

于 2013-03-24T16:51:01.140 回答
1

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

也根据这个:是否可以在 HTTP 中缓存 POST 方法? (检查reBoot的答案),POST请求可以根据RFC进行缓存。但是,浏览器和代理可能无法很好地实现它。无论如何,如果您添加适当的 HTTP 标头,则应该可以使用 HTTP 缓存机制缓存 SOAP over HTTP 消息。

于 2014-04-04T14:02:23.060 回答
1

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

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

于 2018-05-31T03:08:33.343 回答