1

如果一个请求想要获取/删除/更新一个不存在的资源,你希望返回什么?204 还是 404?

示例:api/blog/{id}可以接受请求:GET、DELETE、PUT,并且api/blog可以接受 GET 和 POST。

GET: api/blog返回博客列表,GET: api/blog/{id}返回单个博客,PUT: api/blog/{id}更新单个博客和DELETE: api/blog/{id}删除单个博客。

4

2 回答 2

0

在我看来,重要的区别在于请求是否成功结束。

因此,通常在大多数情况下,404 是要走的路。

我建议这样做,因为 HTTP 响应代码是按结果分组的。资源

  • 信息响应 (100–199)
  • 成功响应 (200–299)
  • 重定向 (300–399)
  • 客户端错误 (400–499)
  • 服务器错误 (500–599)

例如,该过程可以是这样的:

  1. 客户端尝试DELETE一个实体。
  2. 实体不存在。
  3. 这种情况可以被认为是客户端错误,因为正在尝试删除不存在的实体。

在 204 上再次从 MDN引用:

HTTP 204 No Content 成功状态响应代码表示请求已成功,但客户端不需要离开其当前页面。

例如,当为 wiki 站点实现“保存并继续编辑”功能时,可能会使用此功能。在这种情况下,将使用 PUT 请求来保存页面,并且将发送 204 No Content 响应以指示不应将编辑器替换为其他页面。

于 2021-01-29T22:05:11.910 回答
0

如果一个请求想要获取/删除/更新一个不存在的资源,你希望返回什么?204 还是 404?

“这取决于。”

如果响应中的有效负载是“包含错误情况解释的表示,以及它是临时还是永久条件”,那么我将使用4xx 客户端错误状态代码。在我想提请注意请求的目标 uri 的情况下,我将使用404 Not Found

另一方面,如果响应中的有效负载是资源的表示,或者是成功操作的状态的表示,那么我将使用一些2xx 成功的状态代码,通常是200 OK

特别是,如果该有效负载的长度为零字节,我通常会使用 200Content-Length: 0而不是204 No Content204我保留那些我真的希望用户代理保持相同视图的情况。另请参见205 重置内容

(这里的部分课程 - 不要试图从随附的原因短语中猜测状态代码的含义。阅读定义。)


在任何给定时间,资源是否具有“当前表示”是“资源设计”问题。尽管我们以前从未讨论过,但可以说这个文档有一个表示。也许该表示的长度为零字节,也许它具有一些默认表示,例如带有一堆空白的政府表格,稍后要填写。

例如,某个时间段内的活动报告可能具有当前表示,即使该报告所描述的时间段是在未来。


响应 PUT 或 DELETE 的404很奇怪

PUT 在语义上接近 UPSERT,当我要求您将其替换为有效负载中提供的表示时,您无法找到资源的当前表示,这很奇怪。

同样,DELETE 是关于将资源与其实现分离。既然已经完成了,为什么还要报告你做不到呢?

于 2021-01-30T16:50:48.663 回答