HTTP主要分为2种缓存方式,1.强制缓存,2.协商缓存。
强制缓存:
浏览器来判断是否使用本地缓存,主要由 Cache-Control 和 Expires 两个字段来实现,举个例子:
1.当浏览器第一次请求服务器时,服务器会返回对应的资源,并且在 Response的头部加上Cache-Control字段,在这个字段里面设置了过期时间
2.当浏览器再次请求该资源时,浏览器会判断该资源的Cache-Control字段是否过期,如果没有过期,则使用该缓存,不请求服务器
3.如果发现资源已经过期,会再次请求服务器,服务器会返回资源并更新Cache-Control的过期时间
协商缓存
客户端和服务器协商来判断是否使用本地缓存,有2种方式:
1.ETag 标签
服务器会在Response 中加上一个 ETag 标签,用于唯一标识,客户端后续请求的时候会在请求头中的 If-None-Match 字段附加上该 ETag 标签,服务器收到ETag 标签后,会与服务器中的资源的 ETag 标签进行比对,如果服务器中的资源没有更改,则返回 304 Not Modified ,客户端使用本地缓存
2.Last-Modified 和 If-Modified-Since字段
服务器在响应中会附加 Last-Modified 字段,表示资源最后修改的时间,后续客户端请求的时候会附上 If-Modified-Since 字段发送该时间,服务器收到之后会与资源的Last-Modified 字段对比,如果发现对不上,说明资源已经被修改了, 那就不使用缓存并且返回资源,修改 Last-Modified ,否则使用本地缓存
相比之下,ETag会更好一点,因为就算资源未被改动,但是资源的最后修改时间是可能发生变化的,这就会使得服务器认为资源被改动了,会重新发送新资源,甚至有些服务器并不能精确地获取文件的最后修改时间
注意,协商缓存这两种方式都需要配合强制缓存中 Cache-Control 字段来使用,只有在强制缓存走不通的情况下,协商缓存才会被考虑。
GET 和 POST
GET:
1.常见于请求数据,数据会写在URL中,不安全
2.游览器会对URL的长度做限制
3.因为URL只支持ASCII , 所以请求的参数也只能是ASCII
4.幂等的,因为多次请求同一资源并不会产生不同结果
5.可以被缓存
POST:
1.常见于提交表单和上传文件,用于提交数据,数据不会写在URL中,相对安全(虽然URL中看不到你提交的数据,但抓个包就能看到了)
2.非幂等的,多次提交可能导致不同的结果,因为你可能会修改服务器上的资源
3.默认情况下不使用缓存
最后,GET 请求也可以带 body,只不过GET是请求资源,而你附加的 body 没有任何意义罢了。
同样的,POST请求的URL中也可以附带参数。