HTTP1.1 介绍
HTTP 报文
HTTP 报文主要由请求行、请求头部、空行和请求主体4个部分组成。
一般格式如下
请求报文格式
<method> <request-url> <version>
<headers>
<body>
响应报文格式
<version> <status> <reason-phrase>
<headers>
<body>
请求报文和响应报文的差别主要在起始行。各位置含义如下:
<method> 指请求方法,常用的主要是 Get,Post 等。
<version> 指 http 协议版本,现在大多是 http/1.1
<request-url> 指请求的地址
<status> 指响应状态码,200,404 等
<reason-phrase> 原因短语,200 OK,404 Not Found 这种后面的就是原因短语。
请求方法
最常用的是 Get 和 Post。
Get 和 Post 的区别
在传输方式上,Get 方式请求的数据都在 url 后面。同时长度会因为浏览器有限制。
在语义上,Get 方法一般用来获取某个 URL 资源,其行为可以看做是一个读操作。
Post 方法通常用来对某个 URL 做添加,修改操作。
请求头
状态码
Http 缓存
当客户端请求到服务端资源之后,会在本地缓存下来,这样下次再请求该资源的时候就不需要再次向服务器请求,可以直接在本地拿到资源。
当然,这个缓存肯定有一个过期时间,在过期时间内对这个资源的请求可以直接从本地获取。所以发起一个请求的时候,需要先对资源进行判断,看看是否可以直接使用这个缓存资源。这个操作叫做新鲜度检测。
新鲜度检测
缓存的时间是由服务器返回的,服务器在响应报文中添加 Cache-Control: max-age 或者 Expire 头部来指定过期时间。
Cache-Control 是 http/1.1 协议的规范,值是一个相对时间,即多少秒以后,需要结合 last-modified 来计算绝对时间。
Expire 是 http/1.0 的规范,值是一个绝对时间。
再验证
如果资源缓存已经过期,客户端再次发起请求的时候就不能直接使用缓存资源,而是去服务器询问该资源是否已经改变,这个过程叫做再验证。如果服务器发现对应的 url 没有变化,则返回 304 Not Modified,并且不会返回该资源的实体。这成为再验证命中。相反如果资源已经改变,则返回 200 OK,并将新的资源实体返回。
新鲜度检测发现需要验证资源是否改变,我们肯定需要告诉服务器我们现在的资源是什么样的。告诉的方式通过叫做条件请求的方式实现。
Http 定义了 5 个请求头用于条件请求。
If-Modified-Since
If-None-Match
If-Unmodified-Since
If-Range
If-Match
If-Modified-Since 可以结合服务器返回的 Last-Modified 这个响应头使用。发起条件请求的时候,将 Last-Modified 头的值作为 If-Modified-Since 的值传递到服务器。
If—None-Match 需要结合服务器返回的另一个响应头 Etag 使用。Etag 可以认为是服务器对文档资源定义的一个版本号。