一般区别

  • 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来优化网站性能。但这是一个坑!跳入需谨慎。为什么?

  1. GET与POST都有自己的语义,不能随便混用;
  2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点;
  3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次

原文链接 作者:WebTechGarden】