HTTP报文的作用
HTTP报文时是HTTP进行请求和响应时用来交换信息的,可以理解它为搬东西的包裹,来搬运交换的信息
报文流
- HTTP报文在HTTP应用程序(客户端、服务器、代理)之间发送数据块,这些数据块以文本形式描述了报文的内容和含义。
- 这些报文在客户端、服务器、代理之间流动,称之报文流,用流入、流出、上游和下游这些术语描述报文流动的方向
报文如何流动
报文是由客户端流入服务器的
由客户端流入源端服务器,服务器处理完之后,流回(流出)用户的Agent代理中
报文流入源端服务器示意图:
所有报文都会向下游流动
所有报文的发送者都在接收者的上游
对于请求报文来说,客户端是发送者,对于响应报文来说,服务器端是发送者
报文向下游流动示意图:
报文的组成部分
报文语法
HTTP报文分为两类:
- 请求报文:客户端向web服务器请求一个动作
- 响应报文: 服务器将请求结果返回给客户端
请求和响应报文的基本报文结构相同,都是由三部分组成:
- 起始行:对报文进行描述
- 首部:一些属性
- 主体:数据【可选】
请求报文和响应报文只有起始行的语法不同
- 请求报文结构
<method> <request-url> <version>
<header>
<entity-body>
- 响应报文结构
<version> <status-code> <reason-phrase>
<header>
<entity-body>
下面是对各部分的简要说明:
字段名 | 描述 |
---|---|
方法(method) | HTTP请求方法 |
请求url (request-url) | 请求资源的路径 |
版本(version) | 使用的HTTP版本,格式为: HTTP/<主要版本号>.<次要版本号> |
状态码(status-code) | 数字HTTP状态码,用于描述请求过程的状态,比如成功、失败 |
原因短语(reason-phrase) | 上面数字状态码的简短文本描述 |
首部(header) | 可以有0或多个首部。格式为: <名字>:<值>,以空行结束 |
主体(entity-body) | 包含由任意数据组成的数据块,并不是所有报文都有主体 |
请求和响应报文示例:
起始行
上面我们知道HTTP报文分为请求报文和响应报文两类,而且只有起始行不同
这里我们是请求报文的起始行为请求行,响应报文的起始行为响应行
HTTP报文-首部部分
HTTP报文的首部字段向请求和响应报文中添加一些附加信息,本质上来说,它们只是一些<名字>/<值>对的列表
首部分类
HTTP规范定义了几种首部字段,应用程序也可以随意发明自己所用的首部
- 通用首部
既可以出现在请求报文中,也可以出现在响应报文中
字段 | 描述 |
---|---|
Cache-Control | 通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制。 |
Connection | 控制不在转发给代理的首部字段;管理持久连接。 |
Data | 表明创建HTTP报文的时间和日期。 |
Pragma | 只用在客户端发送的请求中,所有的中间服务器不返回缓存的资源。 |
Trailer | 事先说明报文主体后记录了哪些首部字段。同样可以用在分块传输编码时。 |
Transfer-Encoding | 规定了传输报文主体时采用的编码方式。 |
Upgrade | 用于检测HTTP协议及其他协议是否可以使用更高的版本进行通信。 |
Via | 为了追踪客户端与服务器之间的请求和响应报文的传输路径。 |
Warning | 通常会告知用户一些与缓存相关的问题的警告 |
- 请求首部
提供请求相关的信息
字段 | 描述 |
---|---|
Accept | 该字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。 |
Accept-Charset | 用来通知服务器用户代理支持的字符集及字符集的相对优先顺序,可一次性指定多种字符集。 |
Accept-Encoding | 用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。 |
Accept-Language | 用来告知服务器用户代理嫩巩固处理的自然语言集(中文或英文等),以及自然语言集的相对优先级。 |
Authorization | 用来告知服务器,用户代理的认证信息。 |
Expect | 客户端使用首部字段Except来告知服务器,期望出现的某种指定行为。 |
From | 用来告知服务器使用用户代理的用户的电子邮件地址。 |
Host | 告知服务器,请求的资源所处的互联网主机名和端口号。Host首部字段在HTTP/1.1规范内是唯一一个必须包含在请求内的首部字段。 |
If-Match | 类似于If-xxx这样的请求首部,可以称为条件请求。 |
If-Modified-Since | 告知服务器若该字段值早于资源的更新时间,则希望能处理该请求。 |
If-None-Match | 该字段值得实体标记值与请求资源的ETag不一致时,它就告知服务器处理该请求。 |
If-Range | 它告知服务器若指定的If-Range字段值和请求资源的ETag值或时间相一致时,则作为范围请求处理。反之则返回全体资源。 |
If-Unmodified-Since | 告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。 |
Max-Forwards | 通过TRACE方法或OPTIONS方法,发送包含首部字段Max-Forwards的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。当服务器接收到Max-Forwards值为0的请求时,则不再进行转发,而是直接返回响应。 |
Proxy-Authorization | 客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需要的信息。 |
Range | 告知服务器资源的指定范围。 |
TE | 告知服务器客户端能够处理响应的传输编码方式及相对优先级。 |
User-Agent | 将创建请求的浏览器用户代理名称等信息传达给服务器 |
- 响应首部
提供响应相关的信息
字段 | 描述 |
---|---|
Accept-Ranges | 用来告知客户端服务器是否能够处理范围请求,以指定获取服务器端某个部分的资源。 |
Age | 告知客户端,源服务器在多久前创建了响应。单位秒。 |
ETag | 告知客户端实体标识,它是一种可将资源以字符串形式做唯一标识的方式。 |
Location | 可以将响应接收方引导至某个与请求URI位置不同的资源。 |
Proxy-Authenticate | 把由代理服务器所要求的认证信息发送给客户端。 |
Retry-After | 告知客户端应该在多久之后再次发送请求。 |
Server | 告知客户端当前服务器上安装的HTTP服务器应用程序的信息。 |
Vary | 可对缓存进行控制,源服务器回向代理服务器传达关于本地缓存使用方法的命令。 |
WWW-Authenticate | 用于HTTP访问认证 |
- 实体首部
描述主体的长度和内容,或者资源自身
字段 | 描述 |
---|---|
Allow | 用于通知客户端能够支持Request-URI指定资源的所有HTTP方法。 |
Content-Encoding | 告知客户端服务器对实体的主体部分选用的内容编码方式。(gzip/compress/deflate/identity) |
Content-Language | 告知客户端,实体主体使用的自然语言。(中文或英文等语言) |
Content-Length | 表明了实体主体部分的大小。 |
Content-Location | 给出与报文主体返回资源对应的URI。 |
Content-MD5 | 是一串由MD5算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。 |
Content-Range | 针对范围请求,返回响应时使用的首部字段,能告知客户端作为相应返回的实体的哪个部分符合范围请求。 |
Content-Type | 说明了实体主体内对象的媒体类型,该字段用type/subtype形式赋值。 |
Expires | 会将资源失效的日期告知客户端。 |
Last-Modified | 指明资源最终修改的时间 |
- 拓展首部
规范中没有定义的新首部
HTTP状态码
HTTP状态码被分为五大类:
- 1xx: 信息性状态码,表示接收到请求并且继续处理
- 2xx: 成功状态码,表示动作被成功接收、理解和接受
- 3xx: 重定向状态码,为了完成指定的动作,必须接受进一步处理
- 4xx: 客户端错误状态码,请求包含错误语法或不能正确执行
- 5xx: 服务器错误状态码,服务器不能正确执行一个正确的请求
常用状态码
状态码 | 短语描述 | 描述 |
---|---|---|
100 | Continue | 继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息 |
200 | OK | 正常返回信息 |
201 | Created | 请求成功并且服务器创建了新的资源 |
202 | Accepted | 服务器已接受请求,但尚未处理 |
301 | Moved Permanently | 请求的网页已永久移动到新位置。 |
302 | Found | 临时性重定向。 |
303 | See Other | 临时性重定向,且总是使用 GET 请求新的 URI。 |
304 | Not Modified | 自从上次请求后,请求的网页未修改过。 |
400 | Bad Request | 服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。 |
401 | Unauthorized | 请求未授权。 |
403 | Forbidden | 禁止访问。 |
404 | Not Found | 找不到如何与 URI 相匹配的资源。 |
500 | Internal Server Error | 最常见的服务器端错误。 |
503 | Service Unavailable | 服务器端暂时无法处理请求(可能是过载或维护) |
完整版状态码
状态码 | 描述 |
---|---|
100 | 客户必须继续发出请求 |
101 | 客户要求服务器根据请求转换HTTP协议版本 |
200 | 表明该请求被成功地完成,所请求的资源发送回客户端 |
201 | 提示知道新文件的URL |
202 | 接受和处理、但处理未完成 |
203 | 返回信息不确定或不完整 |
204 | 请求收到,但返回信息为空 |
205 | 服务器完成了请求,用户代理必须复位当前已经浏览过的文件 |
206 | 服务器已经完成了部分用户的GET请求 |
300 | 请求的资源可在多处得到 |
301 | 本网页被永久性转移到另一个URL |
302 | 请求的网页被转移到一个新的地址,但客户访问仍继续通过原始URL地址,重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。 |
303 | 建议客户访问其他URL或访问方式 |
304 | 自从上次请求后,请求的网页未修改过,服务器返回此响应时,不会返回网页内容,代表上次的文档已经被缓存了,还可以继续使用 |
305 | 请求的资源必须从服务器指定的地址得到 |
306 | 前一版本HTTP中使用的代码,现行版本中不再使用 |
307 | 申明请求的资源临时性删除 |
400 | 客户端请求有语法错误,不能被服务器所理解 |
401 | 请求未经授权 |
402 | 保留有效ChargeTo头响应 |
403 | 禁止访问,服务器收到请求,但是拒绝提供服务 |
404 | 一个404错误表明可连接服务器,但服务器无法取得所请求的网页,请求资源不存在。eg:输入了错误的URL |
405 | 用户在Request-Line字段定义的方法不允许 |
406 | 根据用户发送的Accept拖,请求资源不可访问 |
407 | 类似401,用户必须首先在代理服务器上得到授权 |
408 | 客户端没有在用户指定的饿时间内完成请求 |
409 | 对当前资源状态,请求不能完成 |
410 | 服务器上不再有此资源且无进一步的参考地址 |
411 | 服务器拒绝用户定义的Content-Length属性请求 |
412 | 一个或多个请求头字段在当前请求中错误 |
413 | 请求的资源大于服务器允许的大小 |
414 | 请求的资源URL长于服务器允许的长度 |
415 | 请求资源不支持请求项目格式 |
416 | 请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段 |
417 | 服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长 |
500 | 服务器遇到错误,无法完成请求 |
502 | 网关错误 |
503 | 由于超载或停机维护,服务器目前无法使用,一段时间后可能恢复正常 |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。