如果我有一个REST资源,如下所示:
获取http://www.example.com/customers/ {customerId} / orders
如果提供的customerId不存在,我的服务器应该返回404(未找到)还是400(错误请求)?
答案 0 :(得分:2)
我认为它应该是404状态,因为请求有效,但未找到customerID
。
答案 1 :(得分:1)
我会说在这种情况下你应该返回 404 Not Found
。
为了详细说明这个主题,我对这个例子中的规范的解释如下:
400 Bad Request
用于应用程序成功接收到请求,并且应用程序确定请求有问题:端点不存在,或者端点不存在,格式或性质请求参数/变量在某些方面不正确/格式错误,导致请求无效。
这将站在@Trevor Conn 的示例中,其中请求中的 customerID
格式无效(太长、太短、无效字符等),并且查找或操作不能由于错误而尝试。
200
系列响应(@Trevor Conn 也提到过)表明针对有效实体或主题的请求已成功处理。
204 No Content
应该用于找到主题或执行操作,并且请求的真实有效输出或结果为“Nothing”的情况。
据我所知,这有几件事:
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 Implemented
与 EXPELLIARMUS http://www.example.com/customers/{customerId}
类似,因为它表示请求成功,以及真正的空响应,除了它指示客户端就地重置其文档视图(其中205 Reset Content
根本不会触发任何操作)。
答案 2 :(得分:-1)
有几种不同的方法可以解决这个问题。
如果您正在检查{customerId}并发现它完全是假的,那么400 - 错误请求是有道理的。
但是,如果{customerId}的格式和类型有效,但它不存在,那么我建议使用204 - 无内容。在我看来,自从发现行动以来,这种情况并不恰当。[
假设用户提供了有效路径,即使customerId 123456不存在,则调用成功执行并且不返回任何数据。因此,204 No Content。
200范围内的状态也被视为“成功”状态,因此您可以验证您的呼叫是否已成功格式化{customerId}。确定该Id是否有效可能是另一项服务的责任。