上一节我们介绍了 http 协议的特点,这一节我们来了解一下 http 进行请求响应时传输的报文结构。

报文结构

http 报文分为请求报文和响应报文。

请求报文

如下图所示是一个典型的 http 协议的请求报文。

image.png

它分为三个部分:请求行、报文首部(报文头)和报文体。

其中请求行中包含了三个信息:

  • 请求方法:常见的是 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”这样的请求参数。

响应报文

下面是一个响应报文的内容。

image.png

与请求报文类似,响应报文也分为三部分:响应行、响应头和响应体,响应头和响应体之间也要有一个空行

响应行分为两个部分:报文协议及版本、状态码及状态描述

响应报文的响应头和请求报文的请求头有很多关联,下面再一并说明。

响应体是 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…