状态代码404或400?

时间:2017-02-09 17:26:29

标签: rest

当资源中的对象不可用时,应返回的状态代码是什么? 例如

{

"Id":0,
"name":"user1",
"scheme":{
"id":15,
"name":"scheme1"}

}

如果id为15的方案不存在,应该是什么响应代码?400或404?

2 个答案:

答案 0 :(得分:2)

如果已经对指向确实存在的资源的URL执行了请求,我认为404不适合这种情况。问题出在有效载荷中,因此404与它无关。

JSON文档的语法有效,因此400也不合适。

由于数据无效,您所拥有的是无法处理的实体,因此422将是此处的最佳选择。继续阅读以获得更详细的解释。

未找到和错误请求

假设已经对定位有效资源的URL(即存在的资源)执行了请求,则返回404不适合这种情况,并且可能会产生误解:

  

6.5.4. 404 Not Found

     

404(未找到)状态代码表示源服务器已执行     找不到目标资源的当前表示,或者不是     愿意透露一个存在。 404状态代码没有     表明这种缺乏代表性是暂时的还是暂时的     常驻; 410(Gone)状态代码优先于404     原始服务器可能通过一些可配置的方式知道     这种情况可能是永久性的。

如果JSON格式不正确,则在有效负载中返回带有描述性消息的400将适合这种情况,但事实并非如此:

  

6.5.1. 400 Bad Request

     

400(错误请求)状态代码表示服务器不能或     由于被认为是某种东西,它不会处理请求     客户端错误(例如,格式错误的请求语法,无效请求     消息框架或欺骗性请求路由)。

不可处理的实体

事实上,您所拥有的是由于数据无效而无法由服务器处理的实体。因此,对于这种情况,返回422以及响应有效负载中的错误详细信息将是最合适的方法:

  

11.2. 422 Unprocessable Entity

     

422(不可处理的实体)状态代码表示服务器     了解请求实体的内容类型(因此a     415(不支持的媒体类型)状态代码不合适),以及     请求实体的语法是正确的(因此400(错误请求)     状态代码不合适但是无法处理包含的内容     说明。例如,如果是XML,则可能会出现此错误情况     请求正文包含格式正确(即语法正确),但是     语义错误的XML指令。

只要在 XML

您也可以发现此answer有用。

HTTP API的问题详细信息

HTTP状态代码有时不足以传达有关错误的足够信息。 RFC 7807定义了简单的JSON和XML文档格式,以通知客户端HTTP API中的问题。

它还定义了application/problem+jsonapplication/problem+xml媒体类型。

选择正确的4xx状态代码

以下图表(摘自this page)在选择最合适的4xx状态代码时非常有见地。希望它会对你有所帮助:

Picking the right 4xx status code

答案 1 :(得分:0)

  

当资源中的对象不可用时,应返回的状态代码是什么?

Michael Kropat为choosing an HTTP status code制作了一个非常好的流程图。

第一步是确定您是否有错误。资源架构包含可选元素是完全合理的。如果这适合您的情况,那么只需使用 200 并将其称为一天。

另一方面,如果是错误,您现在需要评估故障原因。

如果问题源于请求,那么您应该查看状态码4xx class中的条目。

  

状态代码的4xx(客户端错误)类表示客户端似乎有错误。

这些都是HTTP请求本身问题的变体;客户端不应该请求该资源,或者客户端需要在请求中包含不同的信息,或者...... RFC 7231详细说明了许多不同的变体。

这里的启发式是客户端可以通过发送不同的请求来解决问题

另一方面,如果请求没问题,但服务器现在无法正确回复,那么您应该查看5xx class

  

状态代码的5xx(服务器错误)类表示服务器知道它已经错误或无法执行所请求的方法。

5xx级别要小得多; 500几乎总是正确的选择,协议并不非常关心将详细信息传达给客户端,因为客户端无法解决服务器问题。

根据您的示例,我最好的猜测是,您应该发送500响应,其中包含"错误情况的解释"或者您应该发送200响应包含资源表示的有效负载,即使该表示不包含所有可选元素。