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


117

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

如果该页面本身不存在,那么我显然会使用404。但是,我的页面之一有一个userid参数(它是“编辑用户”页面),并且如果不存在具有给定用户ID的用户,我将显示一个错误页面,但我也想发送4xx状态标头(因为“ 200 OK”确实不合适)。

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

Answers:


139

对晦涩的HTTP错误代码过于机灵是个坏主意。浏览器有时会以无益的方式做出反应,使情况变得模糊。坚持404。


14
该死的你给了很好的意见:(强迫症不404的所有事情是真实的,但。
嘉莉肯德尔

16
404错误对于区分不良URI与未找到的实体有些含糊。需要新的标准代码来消除404歧义。
Breakskater

2
我更喜欢返回204空内容而不是返回模糊状态代码
hsnslh

46

404返回码实际上表示“未找到资源”,并且适用于已提出请求但不满足要求的任何实体。因此,它对于页面,页面的各个部分以及页面上存在的需要呈现特定请求的任何项目同样有效。

因此404是在这种情况下使用的正确代码。请注意,它并不适用于“服务器没有发现”,这是一种不同的情况,其中一个请求被发出,但都没有得到回答,而不是回答,但没有请求的资源。


1
如果我想更新id = 1的foo对象,并且此id在数据库中没有foo,该怎么办?
valijon

1
在这种情况下,您需要解决一个并发问题:如果检索到一个id = 1的对象,而在尝试更新它时该对象不再存在,则其他线程或进程将忽略您的锁(或者您未设置锁)。并将其删除。这不好。另外,如果您在没有先检查对象id = n的情况下尝试更新它(其中已提供n的对象),那么您就错过了更新逻辑中的验证步骤,这也不是一件好事。
八位大师


8

这取决于userid是资源标识符还是其他参数。如果是这样,则可以返回404,否则返回其他代码,例如

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

免费的InfoQ Explores中的更多信息:REST书。


1
说“附加参数”是指请求标头字段?否则,我不建议您使用412。“ 412(前提条件失败)状态代码表示在服务器上测试时,请求标头字段中给出的一个或多个条件评估为false”。
oferei
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.