我正在Spring Boot中开发REST API,并且试图了解PUT操作。当前,我的PUT操作采用对象ID,并检查该对象是否存在,然后用新对象替换该对象。我有以下问题。
谢谢。
答案 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,则需要进行所有比较并检查例如:
从数据库获取对象
检查并更新任何已更新的业务对象
然后保存。 回答您的问题,不需要修改对象,您不需要比较现有对象和新对象的值。
但是如果客户端可以只发送更新的属性,则最好使用PATCH。
要了解更多信息以及如何实施,请写博客
答案 2 :(得分:0)
REST:PUT端点是否应该在更新之前比较GET响应?
REST和HTTP都没有对实现施加任何特殊的约束-仅约束语义。 RFC 7231
HTTP并未确切定义PUT方法如何影响源服务器的状态,超出了用户代理请求的意图和源服务器响应的语义所能表达的范围。...一般来说,所有实现细节服务器有意将资源接口后面的内容隐藏起来。
RFC 7232可能会为您寻找的线索
如果收到的If-Match条件评估为false,则原始服务器不得执行请求的方法;相反,如果原始服务器已验证请求了状态更改并且已经存在最终状态,则原始服务器必须使用以下两种方式之一响应:a)412(失败的前提条件)状态代码或b)2xx(成功)状态代码之一。反映在目标资源的当前状态中(即,用户代理请求的更改已经成功,但是用户代理可能不知道它,可能是因为先前的响应丢失了,或者其他人进行了兼容的更改)用户代理)。
就规范而言,即使没有操作等同于客户要求,您也可以假装更改了内容。
如果我确实想比较,什么才是知道对象是否真的被修改的最好方法
没有提供足够的信息。这将取决于诸如原始服务器如何存储资源状态之类的事情。如果您只处理原始文档,则比较两个长哈希键可能会很好。