为什么SOAP不能使用HTTP缓存机制

Thi*_*man 8 rest soap http-caching

我正在从SOAP转向REST,我想让我的同事相信这是一个很好的举措.我们不需要SOAP可以提供的额外安全机制.对我们来说,SOAP和WSDL的开销多年来一直被证明是令人头痛的问题.

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

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

Don*_*ows 7

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

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

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

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

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