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