GET
和POST
的区别,从事web开发的随口都能说出一二
关于他们最直观的区别,就是GET
参数在URL
里,POST
参数在request body
里面
当在面试中被问到这个问题,你的内心可能充满喜悦
GET
在浏览器回退时是无害的,而POST
会再次提交请求。GET
产生的URL
地址可以被Bookmark,而POST
不可以。GET
请求会被浏览器主动cache,而POST
不会,除非手动设置。GET
请求只能进行url
编码,而POST
支持多种编码方式。GET
请求参数会被完整保留在浏览器历史记录里,而POST
中的参数不会被保留。GET
请求在URL
中传送的参数是有长度限制的,而POST
么有。GET
只接受ASCII
字符,而POST
没有限制。GET
比POST
更不安全,因为参数直接暴露在URL
上,所以不能用来传递敏感信息。GET
参数通过URL
传递,POST
放在Request body
中。
这些标准答案当然没有错,但是今天,我们深入理解一下GET
和POST
,会发现他们本质上没有区别
GET
和POST
是HTTP
协议发送请求的两种方法。- 通常使用的网络(包括互联网)是在
TCP/IP
协议族的基础上运作 的。而HTTP
属于它内部的一个子集。
HTTP
的底层是TCP/IP
,那么GET
和POST
的底层也是TCP/IP
,也就是说,GET/POST
都是TCP
链接。GET
和POST
能做的事情是一样一样的。你要给GET
加上request body
,给POST
带上url
参数,技术上是完全行的通的。
那么,上面所说的区别又是怎么回事?
这里有个比喻,TCP
就像汽车,我们用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
还是request body
)提出了要求
还有另一个重要的角色:运输公司。不同的浏览器(发起HTTP
请求)和服务器(接受HTTP
请求)就是不同的运输公司。 虽然理论上,你可以在车顶上无限的堆货物(url
中无限加参数)。但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。业界不成文的规定是,(大多数)浏览器通常都会限制url
长度在2K个字节,而(大多数)服务器最多处理64K大小的url
。超过的部分,恕不处理。如果你用GET
服务,在request body
偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET
可以带request body
,也不能保证一定能被接收到哦。
所以,GET/POST
本质上没太大区别,都是TCP
连接,是因为HTTP
协议的规定和浏览器的限定,让他们在应用过程中,产生了一些区别
GET
和POST
还有一个重大区别
GET
产生一个TCP
数据包;POST
产生两个TCP
数据包。
对于GET
方式的请求,浏览器会把http header
和data
一并发送出去,服务器响应200
(返回数据);
而对于POST
,浏览器先发送header
,服务器响应100 continue
,浏览器再发送data
,服务器响应200 ok
(返回数据)
因为POST
需要两步,时间上消耗的要多一点,看起来GET
比POST
更有效。因此Yahoo团队有推荐用GET
替换POST
来优化网站性能。但是需要谨慎替换!
-
GET
与POST
都有自己的语义,不能随便混用。 -
据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的
TCP
在验证数据包完整性上,有非常大的优点。 -
并不是所有浏览器都会在
POST
中发送两次包,Firefox就只发送一次。