说到Http报文,其实Http报文可以分为两种分别是请求报文和响应报文他们的结构都基本相同:
- 起始行(start line):用来描述请求或相应的基本信息
- 头部信息(header):使用kv结构更详细的说明报文
- 消息正文(entity):实际传输的数据
其中的起始行和头部信息经常合称为请求头或者响应头,消息正文成为实体也就是body。Http协议规定报文中必须有header,但是可以没有body。header和body中间使用一个空行分隔。
请求行
请求报文
请求报文中的请求行分为三部分:
- 请求方式:GET POST等
- 请求目标的URI / /abc.html 等
- 版本号:表示报文中使用的http协议版本
举一个完整的请求报文样式:
get /abc.html http/1.1
响应报文
响应报文中的起始行称为状态行,意思是服务器的响应状态。状态行也分为三部分:
- 版本号:表示报文用的http协议版本号
- 状态码:一个三位数字,以代码的形式来说明服务器的响应结果。如 200 404 502等等
- 原因:作为状态码的补充说明,增加可读性。
举个响应报文中的状态行的例子:
http/1.1 404 Not Found
头部信息
起始行+头部字段集合就构成了http报文中完成的请求头或响应头,他们俩唯一的区别就是起始行不一致。具体不一致的内容可以参见第一部分。
头部字段为key: value格式,kv之前使用:分割。头部字段有五个特点:
- 字段名不区分大小写,但是为了方便查看建议还是首字母大写
- 字段名中不允许出现空格和下划线,如果希望将两个单词连接起来,可以使用-链接,如:Content-Length
- 字段名之后需要紧接:,如果中间出现空格就会报错
- 字段的顺序没有意义
- 原则上字段名不能重复,除非有特殊予以的字段,比如Set-Cookie
头字段通常分为四种:
- 通用字段:在请求头和响应头中都可以出现,如Date
- 请求字段,仅仅能出现在请求头中,如Host、User-Agent
- 相应字段:仅仅能出现在响应头中,如Server
- 实体字段,属于通用字段,但是实体字段是专们用来描述body的额外信息的,如Content-Length