比较详细的讨论一下get和post的区别:
● 关于浏览器回退
get请求浏览器回退是无害的,具体指:get请求url资源会被浏览器缓存,回退时则会从缓存中获取该url的资源,而不会发起新的请求。
post请求浏览器回退时会重新发起请求,创建新的资源。
术语上说:get请求是幂等的,post请求是非幂等的。
如何理解幂等呢,我的理解就是:对于同一种行为,无论执行多少次,它返回的结果都是与第一次没有差异。
值得注意的是:幂等性指的是作用于结果本身,而并非资源是否相同,可能某个方法可能每次会得到不同的返回内容,但并不影响结果,这样的也满足幂等性,例如get服务器当前时间。
由于get后续请求都是从浏览器缓存中获取,后续请求结果都与第一次相同,所以它是幂等的。
而非幂等,则是返回的结果与执行次数有关,每次执行返回不同的结果,最简单的例子就是累加操作。
由于前面说到,post请求每次都会创建新的资源(结果不同了),所以它是非幂等的。
● 关于浏览器对url资源的处理
前面也说到了,get请求url地址会被浏览器主动缓存,而post不会(除非手动设置)
● get 请求的url地址可以被bookmark(存为书签),而post产生的url地址不可以保存为书签,同时get请求的url地址会被存入浏览器历史记录中,而post请求则不会。
● 关于参数长度不同的解释,这里我以前也是认为get参数是有长度限制的,post的参数则不限制长度。实际上,通过查阅相关文章,我发现:
Http的get请求方法提交的数据大小长度并没有限制,Http协议规范没有对URL长度进行限制。目前说的get长度有限制,是特定的浏览器及服务器对它的限制。
理论上讲,post是没有大小限制的。Http协议规范也没有进行大小限制,起限制作用的是服务器处理程序的处理能力。
● 安全性
get请求参数会暴露在url中进行传输,而post请求参数是放在Request Body中,相对来说比get安全。
● get请求只支持url编码,而post支持多种编码方式。
● 针对数据的操作不同
get主要是用来读取数据,而post主要对数据进行增删改。
● get比较常见的是通过url发起请求,而post的较为常见的是通过表单发起请求。
● get请求产生1个TCP数据包,post请求产生2个TCP数据包。
对于get方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于post,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
相当于post会向服务器发送一次预检请求,服务器会返回一些信息,通过这些信息可以判断该请求是否应该被发起。
因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?