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



我正在Spring启动中开发一个REST API,我正在尝试理解PUT操作。 目前,我的 PUT 操作获取对象 ID 并检查对象是否存在,然后用新对象替换对象。我有以下问题。

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

谢谢。

不,你不需要一般比较。PUT意味着您需要用新值替换所有值,但是如果您需要保留创建者或创建时间属性,则应从数据库获取记录并将先前记录中的必要值更新为新值。

如果你需要比较两个对象,你需要覆盖等于和哈希代码方法。 然后你可以检查 a.equal(b( 来检查值是否被更改。请记住,如果对象包含数据时间或随机生成数,请避免将它们添加到相等的方法中。

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

您可以在PUT或PATCH之间做出决定,并非所有协议都支持PATCH。

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

如果您在那里使用 PUT,则需要执行所有比较操作并检查例如:

  1. 从数据库获取对象

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

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

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

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

HTTPPUT 与 REST API 中的 HTTP PATCH

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

REST和HTTP都没有对实现施加任何特定的约束 - 只有语义受到约束。 RFC 7231

HTTP 没有准确定义 PUT 方法如何影响源服务器的状态,超出用户代理请求的意图和源服务器响应的语义所能表达的范围。 一般来说,资源接口背后的所有实现细节都被服务器有意隐藏。

RFC 7232 可能知道您要查找的内容

如果收到的 If-Match 条件的计算结果为 false,则源服务器不得执行请求的方法;相反,如果源服务器已验证正在请求状态更改并且最终状态已反映在目标资源的当前状态中(即 用户代理请求的更改已经成功,但用户代理可能不知道,可能是因为先前的响应丢失或其他用户代理进行了兼容的更改(。

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

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

提供的信息不足。 这将取决于源服务器如何存储资源状态。 如果您只是处理原始文档,那么比较两个长哈希键可能很好。

最新更新