Web services “我应该返回什么Http代码?”;找不到的东西;?

Web services “我应该返回什么Http代码?”;找不到的东西;?,web-services,http,lookup,Web Services,Http,Lookup,我正在构建一个web服务,在这个特定的例子中,它用于询问有关用户的信息 为了便于讨论,我们假设查找web命中率为: 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%20g

我正在构建一个web服务,在这个特定的例子中,它用于询问有关用户的信息

为了便于讨论,我们假设查找web命中率为:

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状态码返回。例如:

GET /patrons/1322 HTTP/1.1

HTTP/1.1 404 Not Found
我曾考虑过使用404(未找到),这是一个有效的响应(请求的资源确实没有找到)。但我担心调试它的人可能会认为这意味着他们拼写的
/customers/
错误

有人能想到我可以使用的另一个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。

IMHO,HTTP响应不是处理此问题的合适位置,因为错误不在HTTP级别。它位于应用程序级别。一种可能的解决方案是使用返回符合用户界面的空“用户”,但表示不存在这样的人



更新:我确信这个答案是错误的。但是,我不想说了,因为这是一个潜在的有效答案(取决于问题中未提供的细节),我认为这些评论很有启发性。

404 not Found是正确的返回,如果它是一项服务,它不是真的被人类使用,而是被机器使用,因此,打字错误不应该是您首先关心的问题

而且,无论如何,你都无法做什么来对抗人类的行为(思考一件事而实际上是另一件事)。如果返回一个小错误消息作为错误代码的一部分,那么一切都应该解决。你甚至可以向他们建议一个可能的解决方案


当应用程序完全按照设计的方式运行时,返回500也有点奇怪。404准确地描述了这种情况:未找到资源。

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

另外,我之所以说500比较合适的另一个原因是,根据我在.NET web服务中的经验,每当我在网络上抛出异常(例如RecordNotFound异常)时,web服务器和客户端总是将响应解释为500状态码


不管是哪种方式,最好检查这组http状态代码,并确定最适合您需要的代码。

对于这种情况,错误404实际上是一个更可接受的响应,因为确实找不到资源。您可能总是有一个自定义错误文档,解释找不到的是用户ID

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

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

404是唯一适当的反应,除非你想考虑它是完全有效的请求,返回状态200和解释所请求的保护者不存在的页面。< /P> 根据我对这个问题的最初评论:


我不认为200级误差也合适,考虑W3

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

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

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

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

然而,对于RESTWebService,您可以直接使用HTTP方法和状态进行消息交换。REST使用不同的HTTP方法(GET/POST/PUT/DELETE)指定所需的操作,服务器将状态返回为HTTP状态。因此,对于RESTWebService,如果找不到用户,404将是正确的HTTP状态


我认为500在任何情况下都是不合适的,因为5xx表示服务器端出了问题(事实并非如此),而4xx表示客户端出了问题。

如果您想通过HTTP响应代码控制web服务的响应,那么您确实可以使用404来指示
GET /posts/1027301 HTTP/1.1