POST不存在的ID时,REST API是否应该返回404?

时间:2019-07-03 14:22:31

标签: rest http http-status-code-404

据我了解,除了返回404 Not Found用于未知的端点,REST API在以下情况下还应返回404:

  • 请求路径中不存在的ID的资源 :路由/users/{id}存在,但/users/123456不存在
  • 使用查询参数中不存在的ID请求资源:路由/search存在,但如果用户不存在,/search?user=123456返回404(I similar question几年前问过)

现在,在端点接受带有多个字段的JSON对象的用例情况下,其中之一是不存在的用户的ID:

POST /makeReservation HTTP/1.1
...

{
    "userId": 123456,
    ...
}

这是否还会返回404 ?还是在这种情况下,这是否被视为其他类型的错误(验证错误?)?

1 个答案:

答案 0 :(得分:0)

  

据我了解

我要说的是,您当前的理解要复杂得多。

404 Not Found的意思是:

  

404(未找到)状态代码表示原始服务器未找到目标资源的当前表示,或不愿意透露该资源的存在。

如果不清楚“目标资源”,我们可以查看Request Line的规范。

  

request-line =方法SP请求目标SP HTTP版本CRLF

     

请求目标标识Section 5.3中定义的应用请求的目标资源。

换句话说,404说“请求目标的拼写有问题”。

因此,当实际问题在请求正文中时,建议请求目标存在问题是一种误导。

在这种情况下,您可能需要的错误代码为422 Unprocessable Entity

  

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

IANA的HTTP Status Code Registry是一个确定地方,当您确定应该为您的用例提供标准化代码时,却很难猜测哪个规范描述了它。

  

它是WebDAV的一部分,我不确定将其用于其他应用程序是否正确?

TL; DR:如果用于其他应用程序,则是正确的。

HTTP规范定义了process,通过它可以将新代码添加到状态代码注册表中,并且WebDAV代码遵循该过程。因此我们可以确信422的含义不会被其他语义替代(出于兼容性的考虑,状态码已淘汰-参见状态码306。)

WebDAV规范中422的定义不是特定于WebDAV的。

此外,RFC 7231

中描述了不了解WebDAV规范的客户端的行为。
  

客户必须理解第一个数字所指示的任何状态码的类别,并且将无法识别的状态码视为等同于该类别的x00状态码,但接收者不得缓存响应带有无法识别的状态代码。

您还可以查看appendix B WebDAV规范。

(作为附带说明,我认为您的担心是合理的-在此上下文之外,WebDAV 方法很难重用。)