18

正常的 HTTP 响应如下所示:

HTTP/1.0 200 OK

可以省略RFC所说的Reason-Phrase吗?就像是:

HTTP/1.0 200

RFC 说:

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
Reason-Phrase  = *<TEXT, excluding CR, LF>

我将其理解为:

  • Reason-Phrase 可以使用空字符串
  • 但是无论如何,状态码之后应该有一个空格

所以以下是有效的:

HTTP-Version SP Status-Code SP CRLF

我是否正确理解了 RFC?

4

2 回答 2

18

如果您*像正则表达式一样将其读取为“零个或多个字符”,它看起来就是这样。

如果您阅读RFC的Notational Convention ,它的含义似乎略有不同:

*rule

The character "*" preceding an element indicates repetition. The full form is "<n>*<m>element" indicating at least <n> and at most <m> occurrences of element. Default values are 0 and infinity so that "*(element)" allows any number, including zero; "1*element" requires at least one; and "1*2element" allows one or two.

所以虽然不是正则表达式,但意义本质上是一样的。在这种情况下,没有尾随数字的星号意味着可以有“0 个或多个”“文本”。奇怪的说法,但似乎你是对的。

严格来说,空格强制性的,尽管我认为如果没有要分隔的内容,可能会省略分隔符。但是,如果他们只是在空格上拆分此字符串并尝试读取描述应该在其中的元素,它可能会杀死具有严格实现的客户端。但是话又说回来,那些客户应该使用一些防御性编程来捕捉这种情况。;)

RFC确实说它可以是任何文本,只要它是对问题的可读描述。这个文本很重要,因为客户端可能不理解状态码的确切含​​义,所以它可能需要将文本显示给用户。因此,即使您可以省略它,我个人也不会。

于 2013-07-07T22:41:22.310 回答
2

原因短语确实是可选的。事实上,HTTP/2 甚至完全放弃了它

HTTP/2 没有定义携带包含在 HTTP/1.1 状态行中的版本或原因短语的方法。

于 2015-09-15T19:26:42.610 回答