HTTP/1.1 协议 4-7

4 HTTP 消息

4.1 消息类型

HTTP消息由客户端到服务端的请求和服务端到客户端的响应组成。

HTTP-message = Request | Response ; HTTP/1.1 messages

请求和响应信息使用RFC 822 [9]中的通用消息格式来传输实体(消息有效载荷)。两种消息都有一个开始行、零或多个报头域(也被成为报头headers)、一个指定报头域结束的空行以及一个可能的消息主体。

generic-message = start-line

*(message-header CRLF)

CRLF

[ message-body ]

start-line = Request-Line | Status-Line

为了保持鲁棒性,服务段在获取请求行(Request-Line)时应该(SHOULD)忽略接收到的空行,换句话说,如果服务正在信息开始时读取协议流,那么它应该忽略最先接收到的CRLF。一些有缺陷的HTTP/1.0客户端实现会在POST请求之后产生额外的CRLF。需要重复一下,BNF所明确禁止的是,HTTP/1.1绝对不能(MUST NOT)在请求的前后有额外的CRLF

 

4.2消息报头( Message Headers

HTTP报头域包括e general-header (section 4.5), request-header (section 5.3), response-header

(section 6.2)entity-header (section 7.1)等域,都遵循RFC 822 [9]3.1章所给出的通用格式。每个报头域有一个名字和一个紧随其后的“:”以及域值组成。域名字不区分大小写。域值可以(MAY)以任意数目的LWS开头,不过最好是一个SP。报头域可以通过在行开头追加至少一个SP或者HT的方式来扩展成多行。应用程序在生成HTTP结构时应该遵从那些熟知的或者指定的“通用形式”,因为可能已经有许多实现可能无法处理超出通用形式的结构。

message-header = field-name ":" [ field-value ]

field-name = token

field-value = *( field-content | LWS )

field-content = <the OCTETs making up the field-value

and consisting of either *TEXT or combinations

of token, separators, and quoted-string>

field-content 不包括开头和结尾LWS:出现在域值非空格字符前后的空白。这些开头或结尾的LWS可以在不改变域值语义的前提下删除。任何出现在field-content之间的LWS可以在解释区值或转向消息流前替换为一个SP。不同域名的报头域的次序并不重要。但是,最好首先发送通用报头域,其次发送请求报头域或者响应报头域,最后发送实体报头域。

只有对应报头域的全部域值被定义为一个逗号分隔的列表时,相同域名的多个消息报头域肯能会出现在一个消息里[例如 #(values)]必须可能把多个报头域合并成“field-name: field-valu”对而不改变语义,通过向第一个field-value追加后续的值,这些值由一个“,”来间隔。

由于需要解释组合的域值,所接收的同一域名的报头域的次序是重要的,同样的原因代理不能更改消息投递时域值的顺序。

4.3 消息体(Message Body

HTTP信息的消息体(如果有)是用来传送请求或响应的实体主体。消息体与实体主体的唯一区别在于是否进行传输编码,编码由传输编码(Transfer-Encoding)域来指定(14.41章)。.

message-body = entity-body

| <entity-body encoded as per Transfer-Encoding>

传输编码必须(MUST)用来指定一些传输编码来由应用程序来确保消息安全与恰当的传输。传输编码是消息而不是实体的属性,因此它可以(MAY)被请求/响应链里的应用增加或者删除。。(但是,3.6章对何时使用什么样的传输编码做出了限制)。

消息里是否有消息体的规则对请求和响应是不同的。

请求的消息头里的Content-Length或者Transfer-Encoding报头域决定了在请求里是否存在消息体。如果文档规定了请求方法不能发送实体主体,那么请求中就不能有消息体。服务端应该对所有消息读取和传递消息体;如果请求方法中不包括对实体主体的定义,处理请求时应该忽略消息体。

对响应消息而言,消息是否有消息体取决于请求方法和响应状态嘛( 6.1.1 章)。HEAD请求方法的响应不能有消息体,尽管会有实体报头域来表明已经处理过了。所有1xx(报告),204(无内容)和304(无修改)响应不能包含消息体。其他的所有响应需要包含消息体,不过可以是零长度的。

4.4 消息长度(Message Length

消息的传输长度是指消息体出现在消息里的长度;换句话说是消息经过传输编码后的长度。如果消息包括消息体,那么主体的长度是由以下条件中的一个决定的(顺序优先)

1.         不包含消息体的响应消息(若1xx204304响应以及对HEAD请求的响应)通常在报头域后的第一个空行停止读取,进而忽略出现在消息里的实体报头域。

2.         如果存在传输编码报头(14.41章)域并且报头值不为“identity”,传输长度由传输编码“chunked

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值