带有空数据的 HTTP PUT 的响应代码

Posted

技术标签:

【中文标题】带有空数据的 HTTP PUT 的响应代码【英文标题】:Response code for HTTP PUT with empty data 【发布时间】:2019-04-25 08:34:36 【问题描述】:

什么是最常见/行业标准的 HTTP PUT 响应代码:

客户提出了格式正确的请求并且 文件/消息/数据的内容为空 因为服务器上/数据库中没有任何更改

在我的具体情况下,客户端发送带有空 JSON 的 HTTP PUT,如下所示:


虽然我期待更多这样的东西:


    key1: 
        something: value,
        something2:value2
    ,
    key2: 
        something: value3,
        something: value4
    

在我的情况下,这将转换为将 4 个新行插入到数据库中。

我正在考虑 400(因为当您调用 HTTP PUT 但您没有任何东西可以放入时,它可能是一个错误的请求),200, 204 和 304。

我的问题与 this 和 this 不同,因为它们是关于 HTTP GET 方法的,并且与 this 不同,因为虽然它是关于 HTTP PUT 的,但答案并没有解决我的问题。

【问题讨论】:

投票关闭的任何人都愿意解释他们的推理吗? 【参考方案1】:

PUT 请求应该替换服务器上指定 uri 的内容。

因此,如果 uri 处的资源已经为空,并且要放置的新资源也是空的,则没有任何更改但仍然成功,因此 200 OK 很好。

如果资源不存在并且您创建了一个新的 0 字节资源,201 Created 可能更合适。

如果资源确实存在但它为空,并且您发送一个空的PUT 请求,它应该用一个空的资源替换现有资源。

这是你出错的地方,因为 PUT 不应该像你正在做的那样用于每条记录的“upsert”。

如果您声明的 PUT 请求在语义上是正确的,它应该清除与该位置相关的所有现有记录。

您可能想要的是PATCHPOST

【讨论】:

以上是关于带有空数据的 HTTP PUT 的响应代码的主要内容,如果未能解决你的问题,请参考以下文章

从 Apache 返回空响应

使用 RESTkit PUT 请求、更改标头并将响应保存在核心数据中

处理 http 302 重定向响应

在带有 Wcf 服务的 Angular JS 的预检响应中,Access-Control-Allow-Methods 不允许方法 PUT

资源已存在时POST的HTTP响应代码

如何正确覆盖 `Illuminate\Routing\Router::toResponse` 以便为空响应发送 HTTP 状态代码 204?