非整数 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
我知道标准 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