上一节我们介绍了 http 协议的特点,这一节我们来了解一下 http 进行请求响应时传输的报文结构。
报文结构
http 报文分为请求报文和响应报文。
请求报文
如下图所示是一个典型的 http 协议的请求报文。
它分为三个部分:请求行、报文首部(报文头)和报文体。
其中请求行中包含了三个信息:
- 请求方法:常见的是 get、post,除此之外还有head、put、delete等;后面会详细介绍;
- 请求URI:它和报文头中的 host 组成完整的请求 uri,更多时候它也是一个 url;
- http协议及版本:显示的是 http 的协议及版本信息,表示这个请求使用的 http 协议版本;
接下来是报文头,报文头里面包含了若干个键值对的属性,服务端可以从这里获取到很多关于客户端的信息,比如上图中的 host 是客户端地址,user-Agent 是客户端使用的浏览器版本信息,后面会详细介绍常见的一些属性。
再接着的是 http 的报文体,它与报文头之间一定要保证有一个空行。在如上的一个 post 请求里面,它将 form 表单中的属性值(形如key:value的键值对)编码成格式化的字符串。它可以承载多个请求参数的数据。不仅可以在报文体中传递参数数据。在 get 请求方法中,也可以通过在请求 uri 的末尾加上形如“?name=xxx&age=xxx”这样的请求参数。
响应报文
下面是一个响应报文的内容。
与请求报文类似,响应报文也分为三部分:响应行、响应头和响应体,响应头和响应体之间也要有一个空行。
响应行分为两个部分:报文协议及版本、状态码及状态描述。
响应报文的响应头和请求报文的请求头有很多关联,下面再一并说明。
响应体是 http 请求返回的主体内容,是我们发送这个请求真正需要的东西。一个请求的访问内容,主要会针对返回来进行解析。比如说我们请求一个页面,那么响应体中返回的可能就是一个 html 内容。
http报文头
http 报文头大体可以分为四类,分别是:通用报文头、请求报文头、响应报文头和实体报文头。
在 http1.1 中一共规范了47种报文头字段。下面仅对部分常用的报文头讲解。
通用报文头**
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐条首部、连接的管理 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Trailer | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
Upgrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Warning | 错误通知 |
请求报文头
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Accept-Language | 优先的语言(自然语言) |
Authorization | Web认证信息 |
Expect | 期待服务器的特定行为 |
From | 用户的电子邮箱地址 |
Host | 请求资源所在服务器 |
If-Match | 比较实体标记(ETag) |
If-Modified-Since | 比较资源的更新时间 |
If-None-Match | 比较实体标记(与If-Match相反) |
If-Range | 资源未更新时发送实体Byte的范围请求 |
If-Unmodified-Since | 比较资源的更新时间(与If-Modified-Since相反) |
Max-Forwards | 最大传输逐跳数 |
Proxy-Authorization | 代理服务器要求客户端的认证信息 |
Range | 实体的字节范围请求 |
Referer | 对请求中 URI 的原始获取方 |
TE | 传输编码的优先级 |
User-Agent | HTTP 客户端程序的信息 |
响应报文头
**
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | http服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW=Authenticate | 服务器对客户端的认证信息 |
实体报文头
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的http方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对应资源的URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 响应的实体主体的内容范围(单位:字节) |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
Accept
作用是浏览器申明可以接受的媒体类型。
例如:Accept: text/html
代表浏览器可以接受服务器返回的类型是 text/html,也就是我们常见的 html 文档,如果服务器无法返回 text/html 类型的数据,服务器应该返回一个 406 错误(Non Acceptable)。Accept: / 代表浏览器可以处理所有类型。
如果想要给显示的媒体类型增加优先级,则使用 q= 来额外标识权重值(范围是[0, 1]),默认值为1.0,当服务器提供多种内容时,将会首先返回权重值最高的媒体类型。
Accpet-Encoding
作用是浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip、deflate)。
Accept-Language
作用是浏览器申明自己接收的语言。
例如:Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3
这个例子,表示的是客户端在服务器有中文版资源的情况下,会请求其返回中文版对应的响应,没有中文版时,返回请求英文版响应。
Connection
Connection 我们前面也提到过,当值是 keep-alive 时,一个网页打开后,客户端和服务器之间用于传输 http 数据的 tcp 连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。当值是 close 时,代表一个请求完成后,客户端和服务器之间传输 http 数据的 tcp 连接会关闭,当客户端再次发送请求,需要重新建立 tcp 连接。
Host
host 主要用于指定被请求资源的 Internet 主机和端口号,它通常从 http URL 中提取出来的。
例如在浏览器中输入:http://fanyi.youdao.com/translate_o,浏览器发送的请求消息中,就会包含 Host 请求报头域:“Host: fanyi.youdao.com”。
Referer
这个属性一般没什么意义,主要是告诉服务器这个请求是从哪个页面链接过来的,服务器籍此可以获取一些信息用于处理。
User-Agent
User-Agent 告诉 http 服务器,客户端使用的操作系统和浏览器的名称和版本。很多情况下会通过这个属性来判断浏览器类型,从而进行不同的兼容设计。
Content-Type
这个属性很重要,它说明了报文体内对象的媒体类型。媒体类型包含如下所示。
媒体类型 | 说明 | 媒体类型 | 说明 |
---|---|---|---|
text/html | html格式 | application/xhtml+xml | xhtml格式 |
text/plain | 纯文本格式 | application/xml | xml数据格式 |
text/xml | xml格式 | application/atom+xml | atom xml 聚合格式 |
image/gif | gif图片格式 | application/json | json数据格式 |
image/jpeg | jpg图片格式 | application/pdf | pdf格式 |
image/png | png图片格式 | application/msword | word文档格式 |
application/octet-stream | 二进制流数据(文件附件下载) | application/x-www-form-urlencoded | 表单提交 |
还有其他的属性这里就不再一一赘述了,等后面学习到相应的内容时再介绍这些重要的属性。
to be continue…