非整数 HTTP 响应代码可能吗?

Non integer HTTP response codes possible?

我知道标准 HTTP 响应代码及其分类(1xx、2xx、3xx、4xx 和 5xx)

但是,我看到某些网络请求 return 非标准 HTTP 响应代码,例如 999, 1001, 1002, 1006 等。但是,我从未见过任何包含字母数字字符的 HTTP 响应代码。任何服务器都可以发送非整数响应代码吗?

Non-standard 是 non-standard。你可能会说这是不可能的,或者你可能会说一切皆有可能,直到它破坏了你需要的东西。

实际上,大多数软件将 HTTP 状态代码作为整数传递,如果不是整数,则会拒绝、中断或以意想不到的方式运行。

不要这样做。

服务器响应只是通过网络发送的一系列字节。 HTTP 1.x 是一种 text-based 协议,其中请求和响应(包括状态代码)以定义的格式作为结构化文本发送。因此,很有可能发送字母数字字符,而 standards-compliant 服务器将发送有效的 HTTP 状态代码。

如果发送了 non-numeric 值,不要指望客户对它们做理智的事情。客户非常合理地期望 standards-compliant(数字)值,如果 well-behaved 客户收到不符合标准的内容,他们可能会失败。

示例 HTTP 响应:

以下面的HTTP响应报文为例。在状态行 (HTTP/1.1 200 OK) 中可以找到状态代码 200,以及协议版本 (HTTP/1.1) 和原因短语 (OK)。

HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 35

This sentence is the response body.

没有什么可以阻止服务器用任何其他文本替换状态行中的状态代码。例如,如果允许 non-numeric 值,则以下可能被视为状态代码为“ABC”且原因短语为“测试字母数字响应”的响应。

HTTP/1.1 ABC Test alphanumeric response

IETF 状态码规范

IETF RFC 7230 requires the status code to be a three-digit integer, and RFC 7231 要求状态码的第一位数字在 1 到 5 之间。

3.1.2. Status Line

The first line of a response message is the status-line, consisting of the protocol version, a space (SP), the status code, another space, a possibly empty textual phrase describing the status code, and ending with CRLF.

status-line = HTTP-version SP status-code SP reason-phrase CRLF

The status-code element is a 3-digit integer code describing the result of the server's attempt to understand and satisfy the client's corresponding request.

6. Response Status Codes

[…]

The first digit of the status-code defines the class of response. The last two digits do not have any categorization role. There are five values for the first digit:

  • 1xx (Informational): The request was received, continuing process
  • 2xx (Successful): The request was successfully received, understood, and accepted
  • 3xx (Redirection): Further action needs to be taken in order to complete the request
  • 4xx (Client Error): The request contains bad syntax or cannot be fulfilled
  • 5xx (Server Error): The server failed to fulfill an apparently valid request