状态码404或400?

ANP*_*ANP 2 rest

当资源内部的对象不可用时,应该返回什么状态码?例如

{

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

}
Run Code Online (Sandbox Code Playgroud)

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

cas*_*lin 5

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

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

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

找不到和错误的请求

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

6.5.4。找不到404

该404(未找到)状态代码表示原始服务器没有找到目标资源的电流表示或不愿意透露一个存在。一个404状态代码并不表示这个缺乏代表性的是暂时的还是永久的; 在410(已删除)状态代码优于404如果原始服务器知道,大概是通过一些配置手段,该条件可能是永久性的。

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

6.5.1。400错误的要求

的400(错误请求)状态代码表示服务器无法或不愿请求过程中,由于一些被认为是一个客户端错误(例如,恶意请求语法,无效的请求消息帧,或欺骗性的请求路由)。

不可处理的实体

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

11.2。422无法处理的实体

该422(处理的实体)状态代码表示的服务器理解的内容类型的请求实体的(因此一个 415(不支持的媒体类型)状态代码是不适当的),并且请求实体的语法是正确的(因而400(错误请求)状态代码不合适),但无法处理其中的说明。例如,如果XML请求主体包含格式正确(即,语法正确)但语义上错误的XML指令,则可能发生此错误情况。

只需在显示XML时读取JSON即可。

您可能还会发现此答案很有帮助。

HTTP API的问题详细信息

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

它还定义application/problem+json和application/problem+xml媒体类型。

选择正确的4xx状态代码

下图(摘自本页)在选择最合适的4xx状态代码时非常有见地。希望它将对您有所帮助:

选择正确的4xx状态代码

  • 非常有用的图表。谢谢 (2认同)