HTTP的GET和POST的本质区别
一般区别
- GET提交的数据放在URL中,POST则不会。这是最显而易见的差别。这点意味着GET更不安全(POST也不安全,因为HTTP是明文传输抓包就能获取数据内容,要想安全还得加密)
- GET提交的数据大小有限制(是因为浏览器对URL的长度有限制,GET本身没有限制),POST没有
- GET只允许ASCII字符,POST没有限制
- GET回退浏览器无害,POST会再次提交请求(GET方法回退后浏览器再缓存中拿结果,POST每次都会创建新资源)
HTTP与GET/POST的关系
HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议,HTTP由四部分组成
- 请求行:方法+地址+版本号
- 请求头:用于说明服务器要使用的附加信息(Content-Type, Keep-Alive, User-Agent)
- 空行
- 请求体
GET /books/?sex=man&name=Professional HTTP/1.1 Host: www.wrox.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection: Keep-Alive 这里是空行 --------------------
GET或者POST只是不同的方法,它们的底层都是TCP连接,只是行为准则不一样。所以本质上并无区别。
重大区别
GET产生一个TCP数据包,POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200;而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200。
因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?
- GET与POST都有自己的语义,不能随便混用;
- 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点;
- 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次
【原文链接 作者:WebTechGarden】