当资源中的对象不可用时,应返回的状态代码是什么? 例如
{
"Id":0,
"name":"user1",
"scheme":{
"id":15,
"name":"scheme1"}
}
如果id为15的方案不存在,应该是什么响应代码?400或404?
答案 0 :(得分:2)
如果已经对指向确实存在的资源的URL执行了请求,我认为404
不适合这种情况。问题出在有效载荷中,因此404
与它无关。
JSON文档的语法有效,因此400
也不合适。
由于数据无效,您所拥有的是无法处理的实体,因此422
将是此处的最佳选择。继续阅读以获得更详细的解释。
假设已经对定位有效资源的URL(即存在的资源)执行了请求,则返回404
不适合这种情况,并且可能会产生误解:
404
(未找到)状态代码表示源服务器已执行 找不到目标资源的当前表示,或者不是 愿意透露一个存在。404
状态代码没有 表明这种缺乏代表性是暂时的还是暂时的 常驻;410
(Gone)状态代码优先于404
原始服务器可能通过一些可配置的方式知道 这种情况可能是永久性的。
如果JSON格式不正确,则在有效负载中返回带有描述性消息的400
将适合这种情况,但事实并非如此:
400
(错误请求)状态代码表示服务器不能或 由于被认为是某种东西,它不会处理请求 客户端错误(例如,格式错误的请求语法,无效请求 消息框架或欺骗性请求路由)。
事实上,您所拥有的是由于数据无效而无法由服务器处理的实体。因此,对于这种情况,返回422
以及响应有效负载中的错误详细信息将是最合适的方法:
11.2. 422 Unprocessable Entity
422
(不可处理的实体)状态代码表示服务器 了解请求实体的内容类型(因此a415
(不支持的媒体类型)状态代码不合适),以及 请求实体的语法是正确的(因此400
(错误请求) 状态代码不合适但是无法处理包含的内容 说明。例如,如果是XML,则可能会出现此错误情况 请求正文包含格式正确(即语法正确),但是 语义错误的XML指令。
只要在 XML
您也可以发现此answer有用。 HTTP状态代码有时不足以传达有关错误的足够信息。 RFC 7807定义了简单的JSON和XML文档格式,以通知客户端HTTP API中的问题。 它还定义了 以下图表(摘自this page)在选择最合适的 HTTP API的问题详细信息
application/problem+json
和application/problem+xml
媒体类型。选择正确的4xx状态代码
4xx
状态代码时非常有见地。希望它会对你有所帮助:
答案 1 :(得分:0)
当资源中的对象不可用时,应返回的状态代码是什么?
Michael Kropat为choosing an HTTP status code制作了一个非常好的流程图。
第一步是确定您是否有错误。资源架构包含可选元素是完全合理的。如果这适合您的情况,那么只需使用 200 并将其称为一天。
另一方面,如果是错误,您现在需要评估故障原因。
如果问题源于请求,那么您应该查看状态码4xx class中的条目。
状态代码的4xx(客户端错误)类表示客户端似乎有错误。
这些都是HTTP请求本身问题的变体;客户端不应该请求该资源,或者客户端需要在请求中包含不同的信息,或者...... RFC 7231详细说明了许多不同的变体。
这里的启发式是客户端可以通过发送不同的请求来解决问题。
另一方面,如果请求没问题,但服务器现在无法正确回复,那么您应该查看5xx class
状态代码的5xx(服务器错误)类表示服务器知道它已经错误或无法执行所请求的方法。
5xx级别要小得多; 500几乎总是正确的选择,协议并不非常关心将详细信息传达给客户端,因为客户端无法解决服务器问题。
根据您的示例,我最好的猜测是,您应该发送500响应,其中包含"错误情况的解释"或者您应该发送200响应包含资源表示的有效负载,即使该表示不包含所有可选元素。