我正在从SOAP过渡到REST,我想说服我的同事们,这是一个很好的举措。我们不需要SOAP可以提供的额外安全机制。对我们来说,多年来SOAP和WSDL的开销只是一个令人头痛的问题。
除了明显的简化之外,我们系统的一个非常有价值的优点是HTTP缓存机制。我已经阅读了有关该主题的内容,但我仍然不完全理解为什么这些缓存机制无法应用于SOAP消息。
是否仅仅因为REST 按惯例对网址中的所有参数进行编码?由于GET调用也可以有一个带参数的主体,我知道它不受REST限制,但如果你这样做,缓存机制不起作用?
答案 0 :(得分:7)
SOAP,当使用HTTP作为传输机制时,通过HTTP POST请求发送。由于HTTP POST是非幂等的,因此不会在HTTP级别缓存。
REST 可以缓存,只要有问题的请求是幂等的:GET,PUT和(理论上)DELETE。任何POST请求仍然不会被缓存。也就是说,如果你打算用这个做很多工作,你应该看看缓存如何检查它们是否仍然有效。特别是,ETag header将是一种实现缓存的好方法,只要您有一种廉价的方法来计算值应该是什么。
是否只是因为REST按约定编码了url中的所有参数?由于GET调用也可以有一个带参数的主体,我知道它不受REST限制,但如果你这样做,缓存机制不起作用?
REST没有规定如何在URL中编码请求参数的任何特定机制。建议 是客户端从不进行任何URL合成:让服务器完成所有URL创建(通过您想要的任何机制,例如嵌入路径或作为查询参数)。您肯定不应该做的是拥有GET,客户端将一个主体发送到服务器!任何缓存都可能会丢失。相反,当该请求不对应于某个资源的简单提取时,您将该复杂文档POST或PUT到服务器并将操作结果作为一个单独的阶段获取。
复杂文档的POST将操作结果作为另一个复杂文档返回,这几乎就是SOAP的编码方式。如果你想做到这一点,你也可以直接使用SOAP,因为它在许多语言中都有更成熟的工具。如果你想以这种方式运行REST,你可能在某个地方做错了......
答案 1 :(得分:1)
一般说明POST请求是非幂等的,这是不正确的。 POST应该用于非幂等操作,但SOAP并没有真正正确地使用HTTP,并且因为它可能发生,POST用于幂等操作 - 例如用于通过ID获取实体(通常使用它) GET for)。
同样根据这个:Is it possible to cache POST methods in HTTP?(检查reBoot的答案),POST请求可以根据RFC进行缓存。但浏览器和代理可能无法很好地实现它。无论如何,如果添加适当的HTTP头,SOAP over HTTP消息应该可以使用HTTP缓存机制进行缓存。
答案 2 :(得分:0)
另一个原因可能是SOAP URI始终是soap服务器,它不确定需要缓存哪些资源或资源是什么。因此,缓存服务器无法对其不知道的内容执行缓存。但是,REST为每个资源都有URI(可以是同一资源的多个URI),这有助于缓存服务器执行其工作。
除此之外,正如其他答案中所提到的,只有一些HTTP动词用于缓存,如GET,PUT等(主要是GET)。