REST:PUT端点是否应该在更新之前比较GET响应?

时间:2018-09-18 23:47:22

标签: rest api spring-boot

我正在Spring Boot中开发REST API,并且试图了解PUT操作。当前,我的PUT操作采用对象ID,并检查该对象是否存在,然后用新对象替换该对象。我有以下问题。

  1. 在保存新对象之前,我应该将旧对象与新对象进行比较,以了解新对象是否被修改,如果对象未更改,则返回适当的http响应状态?
  2. 如果我确实想比较,什么才是了解对象是否真的被修改的最好方法

谢谢。

3 个答案:

答案 0 :(得分:1)

不,您不需要进行一般比较。 PUT意味着您需要用新值替换所有值,但是如果需要保留created by或created time属性,则应从db获取记录,并将必要的值从以前的记录更新为新值。

如果需要比较两个对象,则需要重写equal和hashCode方法。那么您可以检查a.equal(b)来检查值是否更改。请记住,如果对象包含数据时间或随机数,请避免将它们添加到equal方法中。

PATCH是您需要从db获取当前记录并更新相关值的地方。

答案 1 :(得分:0)

您可以在PUT或PATCH之间进行选择,并非所有协议都支持PATCH。

  

当客户需要完全替换现有资源时,他们可以   使用PUT。当他们进行部分更新时,他们可以使用HTTP PATCH。

如果您使用的是PUT,则需要进行所有比较并检查例如:

  1. 从数据库获取对象

  2. 检查并更新任何已更新的业务对象

  3. 然后保存。 回答您的问题,不需要修改对象,您不需要比较现有对象和新对象的值。

但是如果客户端可以只发送更新的属性,则最好使用PATCH。

要了解更多信息以及如何实施,请写博客

HTTP PUT vs HTTP PATCH in a REST API

答案 2 :(得分:0)

  

REST:PUT端点是否应该在更新之前比较GET响应?

REST和HTTP都没有对实现施加任何特殊的约束-仅约束语义。 RFC 7231

  

HTTP并未确切定义PUT方法如何影响源服务器的状态,超出了用户代理请求的意图和源服务器响应的语义所能表达的范围。...一般来说,所有实现细节服务器有意将资源接口后面的内容隐藏起来。

RFC 7232可能会为您寻找的线索

  

如果收到的If-Match条件评估为false,则原始服务器不得执行请求的方法;相反,如果原始服务器已验证请求了状态更改并且已经存在最终状态,则原始服务器必须使用以下两种方式之一响应:a)412(失败的前提条件)状态代码或b)2xx(成功)状态代码之一。反映在目标资源的当前状态中(即,用户代理请求的更改已经成功,但是用户代理可能不知道它,可能是因为先前的响应丢失了,或者其他人进行了兼容的更改)用户代理)。

就规范而言,即使没有操作等同于客户要求,您也可以假装更改了内容。

  

如果我确实想比较,什么才是知道对象是否真的被修改的最好方法

没有提供足够的信息。这将取决于诸如原始服务器如何存储资源状态之类的事情。如果您只处理原始文档,则比较两个长哈希键可能会很好。