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

时间:2009-06-22 13:47:15

标签: web-services http lookup

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

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

GET /patrons/619 HTTP/1.1

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

HTTP/1.1 200 OK

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

GET /patrons HTTP/1.1
GET /patrons/ HTTP/1.1
GET /patrons/G619 HTTP/1.1
GET /patrons/kirsten%20guyer HTTP/1.1

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

HTTP/1.1 400 Invalid patron number

我希望找到 patron not found 的状态代码,作为HTTP状态代码返回。例如:

GET /patrons/1322 HTTP/1.1

HTTP/1.1 404 Not Found

我已经考虑过使用 404(未找到),其中 是一个有效的响应(请求的资源确实是真的,没有找到。)但是我恐怕人们调试它可能会认为这意味着他们拼错 /patrons/ 错误。

有人能想到我可以使用的其他http状态代码吗?


更新:我正在观看

204 No Content 
The server successfully processed the request, but is not returning any content. 

你说什么?


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

GET /MyStartPage.html HTTP/1.1

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

而StackOverflow确实:

GET /posts/1027301 HTTP/1.1

如果该资源不存在,那么Web服务器应该(正确地)返回404。

9 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:6)

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

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

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

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

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

  

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

答案 3 :(得分:5)

恕我直言,HTTP响应是处理此问题的正确位置,因为错误不在HTTP级别。它在应用程序级别。一种可能的解决方案是使用Null Object Pattern返回符合Patron界面的null“Patron”,但表示不存在此类人员。


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

答案 4 :(得分:2)

通常,如果您的服务遇到无法处理的错误,但请求格式正确,那么我认为您会想要返回500状态代码。

另外,我说500合适的另一个原因是,根据我在.NET Web服务方面的经验,每当我通过网络抛出异常(例如RecordNotFound异常)时,Web服务器和客户端总是解释响应为500状态代码。

无论哪种方式,最好查看这个list http状态代码,并最好地满足您的需求。

答案 5 :(得分:1)

这取决于您正在构建的Web服务类型。

如果找不到请求的对象(顾客),则SOAP和XML Web服务通常会返回200 OK,并将错误类型/消息/描述编码到响应文档中。它们将传输级别(HTTP)与交换的消息(XML)分开。如果您请求不存在的API端点(错误的URL),则仅返回404错误(在传输级别上)。

但是,使用REST Web服务,您可以直接使用HTTP方法和状态进行消息交换。 REST使用不同的HTTP方法(GET / POST / PUT / DELETE)来指定需要的操作,服务器将状态作为HTTP状态返回。因此,在REST Web服务的情况下,如果找不到顾客,404将是正确的HTTP状态。

500在任何情况下都不合适我认为,因为5xx意味着服务器端出现了问题(事实并非如此),而4xx错误意味着客户端出现了问题。

答案 6 :(得分:1)

它可能已经有4年了但它仍然非常相关。对于将由borwsers和本机应用程序使用的API,我发现使用HTTP代码进行状态指示要简单得多。如果需要,可以使用未分配的一些额外代码,以获得与现有HTTP代码不相符的条件。

答案 7 :(得分:0)

Web服务级别的错误不应该仅仅返回一个简单的HTTP状态行,而应该以有效且记录的格式返回内容,这些格式可以由访问您服务的客户端进行解析。返回的文档应包含一个错误代码,该错误代码是特定于您的Web服务的一组记录的代码的一部分,以及该问题的简短描述以及可选的问题的更详细描述。

答案 8 :(得分:0)

如果您想通过HTTP响应代码控制Web服务的响应,那么您确实可以使用404来指示这种情况。

但是,我认为将Web服务的响应完全定义在HTTP响应的主体中更为自然,只需返回200即可成功进行通信(“我理解您的请求并向您发送了适当的响应”) 。在这种情况下,您将使用请求的有效负载(XML或JSON或其他)正常返回200,表示未找到匹配的实体

我认为非200错误代码类似于传统编程语言中的异常,而HTTP响应主体更像返回代码。想象一下,如果你按照惯例实现这个 - 如果没有找到实体,你会抛出异常,还是返回null?就个人而言,鉴于网络连接的脆弱性,我希望为通信中的问题保留所有HTTP级别的错误代码,而且我更愿意总是从服务本身返回200 OK,以及指定结果或任何服务级错误。