REST 404 与 400。使用哪一个?

Cru*_*yro 11 rest http-status-codes http-status-code-404

如果我有如下所示的 REST 资源:

获取http://www.example.com/customers/ {customerId}/orders

如果提供的 customerId 不存在,我的服务器应该返回 404(未找到)还是 400(错误请求)?

Ind*_*nil 9

我相信它应该是 404 状态,因为请求有效,但没有customerID找到。


Mik*_*ike 5

我想说404 Not Found在这种情况下你应该回来。

为了详细说明这个问题,我对本例中的规范的解释如下:

400 Bad Request用于应用程序成功接收请求,并且应用程序确定请求有问题的情况:端点不存在,或者请求参数/变量的格式或性质不正确/格式错误以某种方式使请求无效。

这就是 @Trevor Conn 的示例,其中customerID请求中的格式无效(太长、太短、无效字符等),并且由于错误而无法尝试查找或操作。

这一200系列响应(@Trevor Conn 也提到过)表明针对有效实体或主题的请求已成功处理。

204 No Content应该在找到主题或执行操作,并且请求的真实有效输出或结果为“Nothing”的情况下使用。

据我了解,这做了一些事情:

  1. 它消除了响应真实内容的歧义。其中 200 表示成功,但空响应可能表示某种形式的传输或响应失败。您明确地告诉客户:“我们成功地发现和/或做了一件事,而真正的反应是什么都没有。”
  2. 此外,虽然我自己不使用此代码,但我相信当前的浏览器支持可以防止替换客户端的内容。IE:如果您单击一个 URL,该 URL 命中返回的端点204 No Content,它将向浏览器指示请求已成功,但实际上不会导航到任何地方(视口和当前 URI 都将保持不变)。

在您的情况下,404 Not Found这将是对有效端点请求的正确响应,格式正确customerID,但不会解析为客户。

稍微往兔子洞里走去……

您还可以跟踪哪些有效的customerID已被删除/存档,并响应410 Gone它们是否曾经存在,或者451 Unavailable For Legal Reasons客户是否因法律要求而被删除。

另外值得注意的是,如果您使用 OOP 语言工作,您可能处于将端点/操作视为“方法”的生态系统中。

如果您确实要深入了解 HTTP 响应代码的兔子洞,则值得注意的是,400 Bad Request在这种情况下,句柄的使用缺少“方法”。这与 不同405 Method Not Allowed,其中的“方法”指的Method Not Allowed是 HTTP 方法 ( GET/// ) 。 应该并且仅在客户端尝试对不支持该方法的端点使用这些方法之一的情况下使用。POSTPUTDELETE405

一个例子是使用:

DELETE http://www.example.com/customers/{customerId}/orders
Run Code Online (Sandbox Code Playgroud)

正确的用法是:

DELETE http://www.example.com/customers/{customerId}/orders/{orderID}
Run Code Online (Sandbox Code Playgroud)

再往下看:“不允许”严格指的是该方法是否被实现,如果用户缺乏执行其他实现的 HTTP 方法的权限,则正确的响应将是403 Forbidden,或者401 Unauthorized如果客户端的权限可以无法确定,因为客户端尚未进行身份验证。

更多兔子洞...

501 Not Implemented是 HTTP 方法失败的服务器指示器(因为服务器本身,无论是 Nginx、Apache 还是任何其他服务器)在基础级别上不支持 HTTP 请求方法。

IE:

EXPELLIARMUS http://www.example.com/customers/{customerId}
Run Code Online (Sandbox Code Playgroud)

205 Reset Content类似于204它指示请求成功以及真正的空响应,只不过它指示客户端就地重置其文档视图(根本204不触发任何操作)。