应该什么时候API抛出4xx状态代码(错误)和5xx?

时间:2014-06-04 16:42:03

标签: http error-handling http-status-codes http-status-code-400

这是一个理论问题。 我相信我知道答案,但我收到了相反的答案,所以我想我会在这里问。

在W3C网站上,它说:

  

客户端错误4xx   4xx类状态代码适用于客户端的情况   似乎有错误。

它也说

  

服务器错误5xx   响应状态代码以数字" 5"开头表明案件   服务器知道它有错误或无法执行   执行请求。

我认为这意味着如果请求在语法上是正确的,但在逻辑上是错误的,例如尝试在特定属性上创建具有无效值的对象,那么我的API应该抛出5xx错误,因为服务器DID了解请求,但发现它无效。 另一方面,我被告知它应该是4xx错误(特别是400 Bad Request),因为逻辑错误是在客户端,因为它首先发送了一个无效值。

那么,我应该报告什么错误代码?

1 个答案:

答案 0 :(得分:2)

当问题出在服务器端时,将发生错误。例如,当您使用服务器无法理解的方法或协议发出请求时,代理没有响应等等。每个短:当服务器无法满足请求时。

在您的示例中,4xx错误更合适,因为请求启动器是问题的根源。更具体地说,“422 Unprocessable Entity”错误是合适的,因为RFC 4918表示:

  

422(不可处理实体)状态代码表示服务器   了解请求实体的内容类型(因此a   415(不支持的媒体类型)状态代码不合适),和   请求实体的语法是正确的(因此是400(错误请求)   状态代码不合适但是无法处理包含的内容   指令。

由于各种原因,一些API设计人员试图将自己限制为将使用的一组3-5个状态代码。一般来说,这样做是为了简化API用户的工作,这听起来不错,但有时候这种理念会产生更大的影响。

例如,如果我向某个API发送请求以添加新评论,我会期望授予一些内容,例如(但不限于):

  • 如果没有,请求是POST或给我发回405状态。
  • 如果添加了评论,我会回复201回复,并附上指向我体内新评论的链接。

我有时会得到什么?

  • 如果请求方法不是POST,我将收到400错误。
  • 如果请求是POST,我将返回200状态,有时没有链接到我的新评论。

听起来很混乱?对我来说确实如此。