一、表面上理解

最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数
    GET在浏览器回退时是无害的,而POST会再次提交请求
    GET产生的URL地址可以被Bookmark,而POST不可以
    GET请求会被浏览器主动cache,而POST不会,除非手动设置
    GET请求只能进行URL编码,而POST支持多种编码方式
    GET请求参数会被完整的保留在浏览器历史记录里,而POST中的参数不会被保留
    GET请求在URL中传递参数是有长度限制的,而POST么有
    对参数的数据类型,GET直接受ASCLL字符,而POST没有限制
    GET比POST更不安全,因为参数直接暴露在URL,所以不能传递敏感信息
    GET参数是通过URL传递,POST放在Request Body中

二、GET和POST是什么?

是HTTP协议中的两种发送请求的方法

1.HTTP是什么?

HTTP是基于TCP/IP的关于数据如何在万维网种是如何通信的协议
HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说GET和POST都是TCP链接。
GET和POST能做的事情是一样的,给GET加上request body,给POST带上url参数是完全行的通的。

2.那么区别是怎么回事?

         TCP就像是汽车,我们用它来运输数据,很可靠,从来不会发生丢件少件的现象,但是如果汽车都是一模一样的话,那么就会一团糟,送的货物比较急的车会被堵在路上,整个交通就会瘫痪,为了避免这种情况发生,交通规则HTTP诞生了,HTTP给汽车运输定义了好几个服务类别,GET POST PUT DELETE等,HTTP规定,当执行GET请求的时候,要汽车贴上GET标签(设置method为get),而且要把运输的数据放在车顶上(就是URL路径中)以方便记录,如果是POST请求,就要车上贴POST标签并且把货物放在车厢里。当然你也可以在GET的时候在车内偷藏点货物,但是这是不光彩的事情;当然也可以在POST的时候在车顶放点货物。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。


但是我们只看到HTTP对GET和POST参数的传送渠道(url还是requestbody)提出了要求,那么关于参数大小的限制又是怎么回事?

         车辆送货不能漫无目的,肯定要有目的地,就是"运输公司"。不同的浏览器(发起HTTP请求)和服务器(接受HTTP请求)就是运输公司,顺虽然你可在车顶上无限的放货物(url无限的加参数),但是运输公司不是憨憨,装货和卸货也是很大的成本它们会限制单次的运输量来控制风险,数据量太大对浏览器和服务器都是很大的负担。(大多数)浏览器最多处理64k大小的url。超过的部分就不再处理。如果你使用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET可以带request body,也不一定就能被接收到,现在知道GET 和POST的本质就是TCP/IP链接,并无差别,但是由于HTTP的规定和浏览器/服务器的限制,导致它们在应用过程中体现出了一些不同

GET和POST还有一个重要的区别,简单的说:
         GET产生一个TCP数据包;POST产生两个TCP数据包。
不简单的说:
    对于GET方式的请求,浏览器会把HTTP header和data一并发送出去,服务器响应200(返回数据);
    而对于POST,浏览器会先发送 header,服务器响应100 continue,浏览器在发送data,服>务器响应200(返回数据);
    也就是说GET只需要一躺就会把货物送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼,(说我等下送一批货来,你们打开门接我,然后在把货物送过来)
    所以POST需要两步,时间会多消耗一点,看起开GET比POST更有效,,因此Yahoo团队有推荐GET替换POST来优化网站性能。但是这是一个坑!!
为什么?
  1.GET于POST都有自己的语义,不能随便混用。
  2.据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间的差别基本可以无视,而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点
  3.并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次