0

我们今天讨论了导致状态码 200, OK的传输操作。返回的两个对象看起来像这样。

第一个相当容易掌握(并遵循预期的合同)。

{ name: "john", age: 34, city: "stockholm" }

第二个,遵循合同但毫无疑问的错误数据。

{ name: null, age: -3.141526, city: "http://some.com/address/poof" }

一方声称状态码 200 不正确,因为值错误。另一方辩称,状态码描述了操作本身以及请求/响应的格式,因为传输与合同一致,所以进展顺利。

很明显,REST 端点从它获取数据的源中获取了异常。因此,第一方希望结果是404 not found500 internal error。在前一种情况下对象结构为空(一直为空)并且在后一种情况下它不尝试遵循约定格式的条件下,另一方对其开放。

查看Kamasutra,据说:

请求已成功。响应返回的信息取决于请求中使用的方法。

现在,从技术上讲,我们无法确定请求的资源是否有名称,可能计划出生在 PI 年份,并且恰好居住在将名称更改为 URL 的城市。这实际上是可能的,尽管可能性很小。但是,我希望看到状态码 200 中未包含的内容的明确声明。

问题:要求状态码 400 或更高是否有效,因为这些值看似(或什至明显)错误?

4

1 回答 1

2

不要使用 RFC 2616

RFC 2616现在完全不相关,一旦它被一组共同定义 HTTP/1.1 协议的新 RFC 所取代:

状态码

有关 HTTP状态代码,请参阅RFC 7231。此类文档定义了每个状态代码所指示的内容。选择一个最能给出理解和满足请求的尝试结果的选项。

本文档还定义了状态代码的类别,有助于确定最适合响应的状态:

状态码的第一个数字定义了响应的类别。最后两位数字没有任何分类作用。第一个数字有五个值:

  • 1xx(信息性):请求已收到,继续处理

  • 2xx(Successful):请求被成功接收、理解并接受

  • 3xx(重定向):需要采取进一步的行动才能完成请求

  • 4xx(客户端错误):请求包含错误的语法或无法完成

  • 5xx(服务器错误):服务器未能满足明显有效的请求

请记住 HTTP 状态代码是可扩展的。RFC 7231不包括在其他规范中定义的扩展状态代码。状态代码的完整列表由IANA维护。

无法处理的实体

状态码类别表明2xx请求已成功接收理解接受。一旦不接受无效数据,即服务器无法处理的实体,200状态码就不适合这种情况。

状态码就是您要查找的422内容:请求有效负载的语法是有效的,但由于数据无效而无法处理。看一看:

11.2. 422 无法处理的实体

( 422Unprocessable Entity) 状态码表示服务器理解请求实体的内容类型(因此 415(Unsupported Media Type) 状态码是不合适的),并且请求实体的语法是正确的(因此是400(Bad Request) 状态码不合适)但无法处理包含的说明。例如,如果 XML 请求正文包含格式正确(即语法正确)但语义错误的 XML 指令,则可能会出现这种错误情况。

对于您的情况,只需阅读JSON而不是XML

IANA422中注册并在RFC 4918中定义,该文档定义 WebDAV,是 HTTP 协议的扩展。

决策图

Michael Kropat整理了一组决策图表,帮助确定每种情况的最佳状态代码。状态代码大致分为三个类别:

HTTP 状态码类别


从这里开始:

HTTP 状态码


选择2xx3xx状态代码:

HTTP 2xx 和 3xx 状态码


选择4xx状态码:

HTTP 4xx 状态码


选择5xx状态码:

HTTP 5xx 状态码

于 2018-03-21T23:54:32.380 回答