使用HTTP状态码来表示非HTTP错误是否合适?

3
我认识一个正在编写API的人,想要使用HTTP状态码来报告查询结果。例如,如果用户调用 example.com/api/product_info?product_id=X,且该产品不存在,则会返回 HTTP 状态码 400: 错误请求。我认为,由于这是一个有效的调用(即实际的 HTTP 请求没有格式错误),它应该返回一个200代码响应,并将响应体设置为类似于 {status: 'error'; message: 'No such product'} 的内容。
所以我的问题是,
1)是否适合使用HTTP状态码传达非HTTP程序状态,就像上面的示例一样?
2)是否有一些标准或至少广泛使用的规范描述何时适用HTTP状态码?

我认为当客户端请求不存在的产品资源时,404会更适合您的情况。当某些事情不如预期时,您应该返回4XX或5XX。这个链接可能会有所帮助:https://dev59.com/n14c5IYBdhLWcg3wc5_r
  1. HTTP规范:https://www.ietf.org/rfc/rfc2616.txt
- FrAn
@FrAn 不确定这是否真的是资源不存在的情况。举个例子,如果API调用是/setprice?product=X&price=Y,如果产品X存在但Y不是可接受的价格(例如,当最低价格为$5时,价格为$1),您会返回什么响应?还是404? - Benubird
在这种情况下,我会返回400或403。因为客户端试图设置价格,但是价格值不可接受,并非试图获取产品,所以不能返回404。这是一个非常有争议的问题。 - FrAn
1个回答

2

我刚刚在谈论这个问题 - http://blogs.mulesoft.org/api-best-practices-response-handling/

状态码应反映API的响应,例如200表示“OK”,应用于成功返回的数据。但是,201应该用于创建项目。

如先前所提到的,在用户尝试调用但失败(即:users /?id = 5)的情况下,服务器可以返回400以通知用户发生了错误请求或404如果资源不存在。

这也取决于操作 - 如果他们正在搜索用户并且没有响应,我不会返回错误,只是200没有找到结果。但是,如果他们试图对不存在的用户进行PUT或PATCH,则会告诉他们有一个错误-因为很有可能在其应用程序中存在问题。

在上面发布的链接中,您将找到更多的状态代码,但使用状态代码的最大优势之一是它通过标题告诉客户端实际与服务器发生了什么。这使他们能够进行相对快速(和低内存)的检查,而无需反序列化主体并循环遍历数组以寻找错误键。

基本上,你给他们的工具可以快速轻松地理解正在发生的事情-我认为每个(理智的)开发人员都会感激这一点。

希望这有所帮助! -麦克


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接