应该返回什么Http代码"Thing not found"?

Ian*_*oyd 7 lookup web-services http

我正在构建一个网络服务,在这种特殊情况下,用于询问有关顾客的信息.

让我们说,为了争论,查找网络命中是:

GET /patrons/619 HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

如果找到了顾客,我会返回代码200:

HTTP/1.1 200 OK
Run Code Online (Sandbox Code Playgroud)

如果您省略或给出不是数字的帐号,我将返回400.例如以下错误请求:

GET /patrons HTTP/1.1
GET /patrons/ HTTP/1.1
GET /patrons/G619 HTTP/1.1
GET /patrons/kirsten%20guyer HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

所有返回错误400(错误请求),例如:

HTTP/1.1 400 Invalid patron number
Run Code Online (Sandbox Code Playgroud)

我希望找到未找到顾客的状态代码,作为HTTP状态代码返回.例如:

GET /patrons/1322 HTTP/1.1

HTTP/1.1 404 Not Found
Run Code Online (Sandbox Code Playgroud)

我已经考虑过使用404(Not Found),这一个有效的响应(请求的资源是,真的,真的,没有找到.)但我担心人们调试它可能会认为这意味着他们拼错/patrons/了.

谁能想到我可以使用的另一个http状态代码?


更新:我很有眼力

204 No Content 
The server successfully processed the request, but is not returning any content. 
Run Code Online (Sandbox Code Playgroud)

怎么说你?


不要忘记,并非所有HTTP服务器都提供HTML内容.如果要求IIS Web服务器提供名为的资源:

GET /MyStartPage.html HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

然后HTTP服务器必须决定响应什么.在大多数Web服务器上,名为/MyStartPage.html的资源对应于位于硬盘驱动器上的文件.

而StackOverflow则:

GET /posts/1027301 HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

其中,如果该资源不存在,则Web服务器应该(正确地)返回404.

cgp*_*cgp 17

404 Not Found是正确的回归,如果它是一项服务,它并不是真正被人类使用而是被机器使用,因此,错别字,不应该是你的第一个问题.

而且,你无论如何都无法对抗人类的行为(想到一件事,当它真的是另一件事).如果你作为错误代码的一部分返回一个小错误消息,一切都应该解决.你甚至可以向他们建议一个可能的解决方案.

当应用程序正在完成它的设计时,返回500也似乎有点奇怪.404准确描述了这种情况:未找到资源.


JAR*_*ARC 7

我认为你应该使用404.API的开发人员将理解404的含义,因此将遵循自己通常的调试过程来解决问题.坚持协议.


def*_*nes 6

对于这种情况,错误404实际上是更可接受的响应,因为找不到资源.您可以随时拥有一个自定义错误文档,说明它是未找到的Patron ID.

400错误意味着客户端发送了格式错误的语法,在您的示例中并非如此.因此,您不应该使用此错误代码.可能看起来"错误请求"是准确的,但这实际上意味着请求头语法中存在错误.

这也不是500错误,因为没有发生错误.满足请求的Web服务器没有问题,事实是请求正在寻找不存在的资源.

404是唯一合适的响应,除非您想将其视为完全有效的请求,返回状态200以及解释所请求的Patron不存在的页面.

从我对该问题的原始评论:

我认为200级错误也不合适,请考虑W3上的解释w3.org/Protocols/rfc2616/rfc2616-sec10.html

  • +为什么200可能是好的,而不是说"是,发送200错误代码". (2认同)

Har*_*lby 5

恕我直言,HTTP响应适合处理这个问题,因为错误不在HTTP级别.它在应用程序级别.一种可能的解决方案是使用Null对象模式返回符合Patron界面的null"Patron",但表示不存在此类人员.


更新:我一直坚信这个答案是错误的.但是,我想把它留下来,因为它是一个潜在有效的答案(取决于问题中未提供的细节),我认为这些评论是有益的.

  • 我不同意.HTTP被设计为应用层协议.它是通用的,但状态代码绝对意味着具有意义.它经常被误用作传输层协议,因为所有状态/错误信息都嵌入在内容中,因此HTTP客户端无法访问.但这并没有改变这样一个事实:*它提供了一种传达这类问题的方法. (5认同)
  • 是什么让你认为人类会解释这个? (2认同)