Get与Post的区别
基本概念
GET用来获取资源,他只是查询,获取数据,不会修改服务器的数据;这也说明了他的一定的安全性。因为他是读取的,因此可以对get请求进行缓存。
Post可以向服务器发送修改请求,进行数据的修改。但是post请求不会进行缓存。如果对数据的修改缓存到本地,而服务器什么也没做,那么我们的修改没有意义。
区别
参考(抄袭):GET 和 POST 的区别? - 知乎 (zhihu.com)
我们常说的一些区别都是一些表面上的,比如:
GET
没有POST
安全、GET
请求时URL
的长度是有限制的、GET
没有body
而POST
有body
等等。这些都是针对浏览器中的要求, 在使用HTTP
作为接口进行传输时,就没有这么多条条框框了,此时GET
和POST
只是HTTP
协议中的两种请求方式,而HTTP
协议是基于TCP/IP
的应用层协议, 无论GET
还是POST
,用的都是同一个传输层协议,所以在传输上没有区别
我们前面说,无论是
GET
请求还是POST
请求,其本质都是不安全的,为什么这样说呢?如果仅仅从GET
请求的参数在地址栏是可见的,POST
是不可见的,那就太肤浅了。 由于HTTP
自己本身是一个明文协议,每个HTTP
请求和返回的数据在网络上都是明文传播,无论是url
、header
还是body
。 只要在网络节点捉包,就能获取完整的数据报文,要防止泄密的唯一手段就是使用HTTPS
(用SSL
协议协商出的密钥加密明文HTTP
数据)。为什么在浏览器中
GET
请求方式的url
长度有限制呢?这是因为浏览器要对url
进行解析,而解析的时候就要分配内存。对于一个字节流的解析,必须分配buffer
来保存所有要存储的数据。而url
这种东西必须当作一个整体看待,无法一块一块处理,于是就处理一个请求时必须分配一整块足够大的内存。如果url
太长,而并发又很高,就容易挤爆服务器的内存。
POST
是发送两个请求吗? 上面提到POST
请求可以被分为“请求头”和“请求体”两个部分,那这两部分是一起发送出去呢?还是先发“请求头”,再发“请求体”呢? 在HTTP
协议中并没有明确说明POST
会产生两个数据包。之所以会发两个数据包,则是出于以下考虑:如果服务器先收到“请求头”,则会对其进行校验,如果校验通过,则回复客户端“100 - Continue”,客户端再把”请求体“发给服务器。如果请求被拒了,服务器就回复个400之类的错误,这个交互就终止了。这样做的优点是可以避免浪费带宽传输请求体,但是代价就是会多一次Round Trip。如果刚好请求体的数据也不多,那么一次性全部发给服务器可能反而更好。所以说,这和POST
完全没有关系,只是基于两端的一种优化手段罢了。
Get方法会产生一个TCP数据包,浏览器会把Header和Data一并发送出去,服务器响应200(OK),并回传相应的数据
Post方法
- post请求不会被缓存
- post请求不会保存在浏览器记录中
- post对数据长度没有要求
- 效率低
- 刷新之后数据会被重新提交
Get方法
- 刷新无害
- 可以被缓存
- 会保存在浏览器记录中
- 对数据长度有限制
- url是可见的
- 效率较快