get和post区别
get和post区别,是面试中很常见的问题,但是在我遇到的回答中,却总是不尽人意。在这里我记录一下我的理解
get和post的语义不同
在《http权威指南》p51中介绍了常用的http方法:
其他的一些方法介绍如下
HEAD,PUT,TRACE,OPTIONS,DELETE这几个方法服务器不一定会实现,除了这几种方法,服务器还可以自己扩展一些方法,所谓主体:就是http要传输的内容
HEAD:只从服务器获取文档的头部,不包含主体
PUT:将请求的主体部分存储在服务器,包含主体
TRACE:对可能经过代理服务器传送到服务器上去的报文进行追踪,不包含主体
OPTIONS:决定可以在服务器上执行哪些方法,不包含主体
DELETE:从服务器上删除一份文档,不包含主体
GET:表示从服务器获取一份文档,不包含主体
POST:表示向服务器发送需要处理的数据,包含主体
从上面的定义可以看出:在规范中,get方法一般用来获取资源数据,具有幂等性, 不会改变资源的状态,不论调用一次还是N次都没有副作用。
post则一般是用来更新数据的,不具有幂等性,POST所对应的URI并非创建的资源本身,而是资源的接收者,
承接定义,get方法带的参数是附在header里的。直观上也就是在url?a=1&b=2这样子,在ajax中这个url是写在open方法的第二个参数里
而post则是把发送的数据附在主体里,数据放在ajax的send方法里
据上:则可以发现他们还有区别,get的方法的url?a=1&b=2会被浏览器记住:浏览器会有缓存,浏览器历史记录里会存下这个url?a=1&b=2 这里会有一点点安全性问题。。。
post请求则没有这些烦恼
据上:get请求在地址栏可见则引出下一个大家公认的区别:部分背黑锅浏览器会对地址栏url有限制。。额大家认为IE是2083字节,而post因为数据是在主体发出,则一般认为无限大,其实这个大小是服务器设置的。。。 额,我也懒得测试了。。。get请求可能超出url限制长度这种情况。。。一般在收集log的情况下发生,var img=new Image();img.src="xxx";额解决办法就是计算一下长度。。超出了就分批发出把。。
get只能用ASCII字符类型数据,而post则可以发送任意数据类型,比如:文件,图片以及字符串
最后一点区别,浏览器UI交互上的区别:get方法请求的资源。按F5或者刷新按钮重新载入链接的时候浏览器无任何提示。是的,因为它的幂等性
而post方法,按F5或者刷新按钮重新载入链接的时候浏览器会有confirm提示信息....如果你不明白我说的什么。。点击这里post请求然后按一下刷新F5按钮就明白了
最后留下个问题:大家有没有在实际项目中遇到过某些RD说:你能不能发个请求既有get也有post。。。。
发表评论