我正在Spring启动REST API,我正在尝试理解PUT操作。目前,我的PUT操作获取对象id并检查对象是否存在,然后用新的对象替换该对象。我有以下问题。
谢谢。
不,你不需要一般比较。 PUT意味着您需要用新的值替换所有值,但是如果您需要保留创建的或创建的时间属性,您应该从db获取记录并将必要的值从先前的记录更新为新记录。
如果需要比较两个对象,则需要覆盖equal和hashCode方法。然后你可以检查a.equal(b)来检查值是否改变了。请记住,如果对象包含数据时间或随机生成数,请避免在相等方法中添加它们。
PATCH是您从db获取当前记录并更新相关值的位置。
您可以在PUT或PATCH之间做出决定,而不是所有协议支持PATCH。
当客户端需要完全替换现有资源时,他们可以使用PUT。当他们进行部分更新时,他们可以使用HTTP PATCH。
如果您正在使用PUT,那么您需要进行所有比较并检查例如:
但如果客户端可以只发送更新的属性,那么最好使用PATCH。
要了解更多以及如何实施,请博客
REST:PUT端点应该在更新之前比较GET响应吗?
REST和HTTP都没有对实现施加任何特定约束 - 只有语义受到约束。 RFC 7231
HTTP没有准确定义PUT方法如何影响原始服务器的状态,超出了用户代理请求的意图和源服务器响应的语义所能表达的内容....一般来说,资源背后的所有实现细节界面被服务器故意隐藏。
RFC 7232可能对你正在寻找的东西有所了解
如果收到的If-Match条件的计算结果为false,则原始服务器不得执行请求的方法;相反,原始服务器必须响应a)412(前提条件失败)状态代码或b)2xx(成功)状态代码之一,如果原始服务器已经验证正在请求状态更改并且最终状态已经反映在目标资源的当前状态(即,用户代理请求的更改已经成功,但用户代理可能不知道它,可能是因为先前的响应丢失或其他一些人进行了兼容的更改用户代理)。
因此,就规范而言,你可以假装你改变了一些东西,即使无操作等同于客户要求的东西。
如果我想比较,知道对象是否真的被修改的最佳方法是什么
提供的信息不足。这将取决于原始服务器如何存储资源状态。如果您只是处理原始文档,那么比较两个长哈希键可能没问题。