REST 404与400.使用哪一个?

时间:2017-10-24 02:28:46

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

如果我有一个REST资源,如下所示:

  

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

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

3 个答案:

答案 0 :(得分:2)

我认为它应该是404状态,因为请求有效,但未找到customerID

答案 1 :(得分:1)

我会说在这种情况下你应该返回 404 Not Found

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

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

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

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

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

据我所知,这有几件事:

  1. 它消除了关于响应真实内容的歧义。其中 200 表示成功,但空响应可能表示某种形式的传输或响应失败。你明确地告诉客户:“我们成功地发现和/或做了一件事,真正的回应是什么。”
  2. 此外,虽然我自己不使用此代码,但我相信当前的浏览器支持阻止替换客户端的内容。 IE:如果你点击一个 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/POST/PUT/{{1 }})。 DELETE 应该并且仅在客户端尝试对不支持该方法的端点使用这些方法之一的情况下使用。

一个例子是使用:

405

正确用法在哪里:

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

再深入一点:“不允许”严格指的是该方法是否已实现,如果用户缺乏执行其他已实现的 HTTP 方法的权限,则正确的响应将是 {{1} }, 或者 DELETE http://www.example.com/customers/{customerId}/orders/{orderID} 如果由于客户端尚未通过身份验证而无法确定客户端的权限。

更多兔子洞...

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

浏览器:

401 Unauthorized

501 Not ImplementedEXPELLIARMUS http://www.example.com/customers/{customerId} 类似,因为它表示请求成功,以及真正的空响应,除了它指示客户端就地重置其文档视图(其中205 Reset Content 根本不会触发任何操作)。

答案 2 :(得分:-1)

有几种不同的方法可以解决这个问题。

如果您正在检查{customerId}并发现它完全是假的,那么400 - 错误请求是有道理的。

但是,如果{customerId}的格式和类型有效,但它不存在,那么我建议使用204 - 无内容。在我看来,自从发现行动以来,这种情况并不恰当。[

假设用户提供了有效路径,即使customerId 123456不存在,则调用成功执行并且不返回任何数据。因此,204 No Content。

200范围内的状态也被视为“成功”状态,因此您可以验证您的呼叫是否已成功格式化{customerId}。确定该Id是否有效可能是另一项服务的责任。