如果不需要更新,用 304 响应非条件 PUT 是不是正确?

Posted

技术标签:

【中文标题】如果不需要更新,用 304 响应非条件 PUT 是不是正确?【英文标题】:Is it correct to respond with 304 to non-conditional PUTs if no update was necessary?如果不需要更新,用 304 响应非条件 PUT 是否正确? 【发布时间】:2016-11-08 06:55:42 【问题描述】:

我有一个有点 RESTful API 的资源,我无条件地PUT 数据以确保它存在并且是最新的。例如:

PUT /users/username/ HTTP/1.0
Content-Type: text/json

"email": "username@example.org"

执行此类请求,我不在乎用户是否存在,我想要“创建或更新”逻辑。如果用户不存在,它将被创建(我会以 201 Created 响应)。如果它已经存在,API 服务将确保其用户(电子邮件地址)的概念是最新的。

但是,我想知道以 304 Not Modified(而不是通常的 200 OK)响应非条件请求(没有任何 If-* 标头)在语义上是否正确(相对于标准),以防资源已经处于那个确切的状态,并且没有进行任何更改。

所以,我的问题是,无论何时标准允许此类行为、允许但不鼓励,还是禁止此类行为?

(注意: 目前,添加 ETag 或修改时间只是一件麻烦事,并且会增加服务器端和客户端的复杂性。我不希望客户端保留任何额外的状态信息。)

【问题讨论】:

【参考方案1】:

不,这不正确(请参阅https://greenbytes.de/tech/webdav/rfc7232.html#status.304)。

【讨论】:

谢谢!但它是确定的吗?我知道这个 RFC 为条件请求引入了这个代码,但不确定其他用途是否可以接受。我的意思是,我没有发现任何关于无条件请求的提及(即,对于不属于 RFC7232 主题的请求,没有明确禁止“不得”或劝阻“不应该”使用 304),并且标准非常广泛,因此我决定在这里问。

以上是关于如果不需要更新,用 304 响应非条件 PUT 是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章

springboot的put请求用raw

http之理解304

如何使用条件(where子句)更新实体并在spring数据jpa中的方法响应中获取更新的实体

Fetch API 和 Axios 是不是将 304 响应视为 200?

如果项目不存在,则 Dynamodb 批量放置

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