如果一个请求想要获取/删除/更新一个不存在的资源,你希望返回什么?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}
删除单个博客。
如果一个请求想要获取/删除/更新一个不存在的资源,你希望返回什么?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}
删除单个博客。
在我看来,重要的区别在于请求是否成功结束。
因此,通常在大多数情况下,404 是要走的路。
我建议这样做,因为 HTTP 响应代码是按结果分组的。资源
例如,该过程可以是这样的:
DELETE
一个实体。在 204 上再次从 MDN引用:
HTTP 204 No Content 成功状态响应代码表示请求已成功,但客户端不需要离开其当前页面。
例如,当为 wiki 站点实现“保存并继续编辑”功能时,可能会使用此功能。在这种情况下,将使用 PUT 请求来保存页面,并且将发送 204 No Content 响应以指示不应将编辑器替换为其他页面。
如果一个请求想要获取/删除/更新一个不存在的资源,你希望返回什么?204 还是 404?
“这取决于。”
如果响应中的有效负载是“包含错误情况解释的表示,以及它是临时还是永久条件”,那么我将使用4xx 客户端错误状态代码。在我想提请注意请求的目标 uri 的情况下,我将使用404 Not Found。
另一方面,如果响应中的有效负载是资源的表示,或者是成功操作的状态的表示,那么我将使用一些2xx 成功的状态代码,通常是200 OK。
特别是,如果该有效负载的长度为零字节,我通常会使用 200Content-Length: 0
而不是204 No Content。 204我保留那些我真的希望用户代理保持相同视图的情况。另请参见205 重置内容。
(这里的部分课程 - 不要试图从随附的原因短语中猜测状态代码的含义。阅读定义。)
在任何给定时间,资源是否具有“当前表示”是“资源设计”问题。尽管我们以前从未讨论过,但可以说这个文档有一个表示。也许该表示的长度为零字节,也许它具有一些默认表示,例如带有一堆空白的政府表格,稍后要填写。
例如,某个时间段内的活动报告可能具有当前表示,即使该报告所描述的时间段是在未来。
响应 PUT 或 DELETE 的404很奇怪。
PUT 在语义上接近 UPSERT,当我要求您将其替换为有效负载中提供的表示时,您无法找到资源的当前表示,这很奇怪。
同样,DELETE 是关于将资源与其实现分离。既然已经完成了,为什么还要报告你做不到呢?