为什么SOAP不能使用HTTP缓存机制(Why SOAP can't use HTTP ca

2019-07-23 01:32发布

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

除了明显的简化,我们的系统中的一个非常有价值的优势将是HTTP缓存机制。 我已经就这一课题读的东西,但我还是不完全理解为什么这些缓存机制无法应用于SOAP消息。

难道仅仅是因为REST 按照惯例编码的URL的所有参数? 由于GET调用也可以有参数的身上,我明白,这不是限制了休息,但如果你这样做了缓存机制不工作?

Answer 1:

SOAP,使用HTTP作为转印机构的情况下,经由HTTP POST请求被发送。 作为HTTP POST是非幂等的,它不是在HTTP级别缓存。

REST 可以被缓存,提供有问题的请求是幂等的:GET,PUT和(理论上)删除。 任何POST请求仍然不会被缓存。 也就是说,如果您打算做了很多这个工作,你应该考虑如何缓存检查它们是否仍然有效。 特别是, ETag头将实现缓存提供你要计算的值应该是什么样一种廉价的方式一个很好的方式。

难道仅仅是因为REST按照惯例编码的URL的所有参数? 由于GET调用也可以有参数的身上,我明白,这不是限制了休息,但如果你这样做了缓存机制不工作?

REST没有规定如何在URL编码请求参数任何特定的机制。 什么建议是,客户永远不会做任何URL合成:让服务器做所有的URL创建(通过任何你想要的机制,如路径查询参数范围内或嵌入)。 你绝对不应该做的是在客户端发送一个机构到服务器的GET! 任何缓存可能失去。 相反,当该请求不符合一个简单的获取某些资源,您POST或PUT是复杂的文件服务器和GET操作作为一个单独的阶段的结果。

一个复杂的文档操作返回作为另一个复杂的文档的结果的POST是相当多的SOAP编码方式。 如果你很想这样做,你还不如用SOAP作为直接那种有更成熟的工具在许多语言。 如果你想运行REST这样一来,你可能就错了地方......



Answer 2:

指出POST请求非幂等一般是不正确的。 POST应该用于非幂等操作,但SOAP是不是真的使用HTTP正确作为,它可以发生的结果,POST用于幂等操作 - 例如用于取由ID的实体(你通常会使用获得)。

同样,根据: 是否可以缓存在HTTP POST方法? (检查重启答案),POST请求可以根据RFC缓存。 它可能不是通过浏览器和代理执行得非常好,但。 无论如何,如果你添加相应的HTTP头,HTTP上的SOAP消息应该可以使用HTTP缓存机制来缓存。



Answer 3:

另一个原因可能是SOAP URI始终是SOAP服务器,它不是确定需要哪些资源被缓存或者什么资源。 因此,缓存服务器不能完成的一些它不知道缓存。 然而,REST拥有URI为每个资源(可以是同一资源多个URI),这有助于缓存服务器来执行它的工作。

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



文章来源: Why SOAP can't use HTTP caching mechanisms