如果不需要更新,用 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 是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用条件(where子句)更新实体并在spring数据jpa中的方法响应中获取更新的实体