对于“找不到项目”错误页面,最合适的 HTTP状态码是什么

我很好奇“条目不存在”页面最合适的 HTTP状态码是什么。

如果页面本身不存在,我当然会使用404。但是,我的一个页面有一个 userid参数(它是一个“编辑用户”页面) ,如果没有给定用户 ID 的用户存在,我将显示一个错误页面,但是我还想发送一个4xx 状态头(因为“200 OK”并不真正适合)。

我想404可以,因为它是“未找到”,而不是“未找到文件”,但我想知道是否有一个更好的代码,这种情况下。

159503 次浏览

使用晦涩的 HTTP 错误代码过于聪明不是一个好主意。浏览器有时会以无益的方式作出反应,从而混淆了情况。还是404吧。

404返回码实际上意味着“资源未找到”,并适用于任何实体的请求已经提出,但没有得到满足。因此,它同样适用于页面、页面的子部分,以及页面上存在的任何具有要呈现的特定请求的项。

所以404是在这个场景中使用的正确代码。请注意,没有适用于“服务器未找到”,这是一种不同的情况,在这种情况下,请求被发出但根本没有得到应答,而不是应答但没有请求的资源。

这取决于 userid 是资源标识符还是其他参数。如果是,那么可以返回404,如果不是,那么可以返回其他代码

400 (bad request) ‐ indicates a bad request
或者
412 (Precondition Failed) e.g. conflict by performing conditional update

更多信息在免费的 InfoQ 探索: REST书。

204 :

这段代码意味着服务器已经成功地 处理请求,但不返回任何内容

Https://developer.mozilla.org/en-us/docs/web/http/status/204

/**
* {@code 422 Unprocessable Entity}.
* @see <a href="https://tools.ietf.org/html/rfc4918#section-11.2">WebDAV</a>
*/
UNPROCESSABLE_ENTITY(422, "Unprocessable Entity")

因为它是一个面向用户的页面,所以总是使用 404。这是人们通常知道的唯一代码。

对于 api 请求,使用400和错误消息“ No such user vis”或类似的内容。

如果页面本身不存在,我当然会使用404。

您所说的有点令人困惑,但我必须假设您正在开发一个 API 后端。

问题是,使用 API 端点的人可能会在两个方面感到困惑:

  1. 他们可能认为返回的 404是因为没有到达端点(资源) ,或者
  2. 他们可能认为没有找到被请求的项目或用户。

问题是,他们怎么知道哪个是正确的假设呢?

答案很简单。始终尝试将主体附加到从代码返回的任何错误。服务器自动返回的错误没有主体。因此,请尝试附加一个您可以编写文档的主体,以便他们能够使用主体的内容来区分返回的代码错误和服务器错误。

但是简而言之,返回 404是正确的状态,但是请尝试在其上附加一个主体,以指示返回 404的原因。

例如:

// For illustration I'm just gonna use C#
Return NotFound(new { errorMessage: "Item requested was not found" });

在这里,NotFound返回一个 404状态码,参数是一个类似 { errorMessage: "some reason for the error"}.这样,您总是可以检查您的错误是否返回了一个主体,并且您知道它是从您的代码中返回的。否则,找不到资源(链接)。