参考
背景
之前面试总是被问到 Post 与 Get 请求的区别,因为并没有深层次看过,只是回答了一些表面现象,老是被吐槽。例如 Post 比 Get 安全、Get 用于拉取数据 Post 用于提交数据。
Post
- POST请求会把数据放置在HTTP请求包的包体中,不会直接暴露给用户。
- POST请求,理论上大小是不会限制的,但是实际上各个服务器会规定POST提交数据大小。
- POST相对Get更安全,因为参数不会保存浏览器立式或者是web服务器日志中。
- POST产生两个TCP数据包,header先发送,服务器响应100ms然后继续,发送data,服务器200然后返回数据。
- POST浏览器回退重新请求。
Get
- GET请求的数据会附加在URL之后,用问号分割,多个参数用&进行连接。
- GET请求的数据会暴露在地址栏中。
- GET请求URL的编码格式采用的是ASCII编码,而不是Unicode编码。
- GET请求传输大小有限制,大小在2KB。
- GET相对安全性较差,会被浏览器主动缓存。
- GET产生一个TCP数据包,head和data一起发送。
- GET浏览器回退无害。
GET和POST还有一个重大区别,简单的说: GET产生一个TCP数据包;POST产生两个TCP数据包。 因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。 But…并不是万能的。
GET与POST都有自己的语义,不能随便混用。
在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。