post和get区别的核心点是:缓存机制的区别(浏览器是否可以缓存)缓存机制这里用到了开头提到的幂等性的概念。由于网络的不可靠性,幂等性显得尤为重要,所以get、head、put、delete必须设计成幂等的:如果一个请求在处理后被服务端接收到,但是客户端没有收到响应,则client会再次Request,如果没有幂等性保证,就会出现意想不到的问题。Post不是幂等的。例如,在segmentfault上两次提交同一篇文章将生成两个资源。通常HTTP缓存只适用于幂等请求(idempotentrequests),对于其他类型的响应是无能为力的。当getrequest的缓存进程第一次请求时,返回数据。返回数据,包括http头中的last-modified(最后修改时间)Etag(表示资源状态的唯一标识符)Expires(表示资源在浏览器缓存中的过期时间),浏览器会返回请求的文件放到Cache目录下,保存以上信息,发起第二次请求。浏览器会先检查Cache目录下是否存在该文件,是否过期。如果同时满足这两个条件,浏览器就不会向服务器发送请求,而是直接使用缓存中的文件。否则,浏览器向服务器发送请求,并在头部添加If-Modified-Since和If-None-Match。如果自上次访问后文件没有被修改或者Etag信息没有变化,则直接返回304状态,表示服务器允许请求访问该资源,但不满足条件,body部分不包含任何返回的响应。
