GET请求和POST请求的区别
GET请求和POST请求的区别:
GET | POST | |
后退/刷新 | 请求是无害的 | 会重新请求一次 |
传参 | 参数是连接在url后面的 | 参数是存放在请求体内的 |
参数长度 |
浏览器对url长度有限制 (不同浏览器长度限制不一样),对传参数量有限制,一般限制在 2~8K 之间 事实上get请求也能在requestbody内携带参数,只不过不符合规定,有的浏览器能够获取到数据,而有的不能。 |
参数存放在requestbody内所以参数数量没有限制 |
安全性 | get请求参数暴露在 url 上,所以安全性比post差 | 安全性比 get 好。但从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输,只要在网络节点上抓包,就能完整地获取数据报文。 要想安全传输,就只有加密,也就是 HTTPS |
数据类型的限制 | 只允许 ASCII 字符,只能进行 url 编码 | 无限制,允许二进制数据,支持多种编码方式 |
浏览历史 | 参数保存在历史中,可被收藏为书签,因为参数就在 url 中 | 参数不能保存在历史中,不可被收藏为书签 |
实际上GET和POST本质上没有区别你信吗?
GET 和 POST 都是HTTP协议中的两种发送请求的方法。HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议,HTTP的底层是TCP/IP。
所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP连接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
GET和POST本质上就是TCP连接,并无差别。但是由于 HTTP的规定 和 浏览器/服务器的限制 ,导致他们在应用过程中体现出一些不同。
GET和POST还有一个重大区别:GET产生一个TCP数据包,POST产生两个TCP数据包。
- 对于GET方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应200(返回数据);
- 而对于POST,浏览器先发送 header,服务器响应100 continue,浏览器再发送 data,服务器响应200 ok(返回数据)。
所以貌似 GET请求比 POST 请求的速度更快一点,看起来GET比POST更有效。因此有团队推荐用GET替换POST来优化网站性能。但是不要这么做:
- GET与POST都有自己的语义,不能随便混用。
- 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
- 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。