二者在传输上基本没有区别,二者都是HTTP请求中的两种。HTTP协议是基于TCP/IP的应用层协议,所以无论GET还是POST,用的都是同一个传输层协议,所以在传输上可以认为基本无差别。
它们的主要区别如下:
1、应用场景的区别:
GET请求是一个幂等的请求,一般用来请求获取数据,比如查询,对服务器资源不会产生影响;
POST请求不是一个幂等的请求,一般用来提交数据到后台,比如创建或者更新表单,会对服务器资源产生影响;
幂等是指同样的请求被执行一次或者多次,最终得到的结果都是相同的。幂等性表示接口可重复调用。
2、安全性和参数的区别:
GET请求传递的参数一般是拼接在URL后面的,暴露在地址栏上,安全性很低,还会被保留在历史记录中;
POST请求一般将传递的参数放在 Request body 请求体中,不会在地址栏显示,安全性比GET请求高一点,但是也是不安全的;
3、是否被缓存的区别:
GET请求可以被缓存,也会保留在浏览器的历史记录中;
POST请求一般不会被缓存,也不会保留在浏览器的历史记录中;
通常HTTP请求只适用于不改变服务端数据的请求,比如查询类的请求,因为GET通常是用于获取数据,一般不做更新服务器数据的操作,所以符合HTTP缓存适用于不改变服务器数据的请求的原则,所以说GET请求可以被缓存。
4、请求长度的区别:
GET请求传递的参数一般显示在地址栏上,由于浏览器对URL的长度有限制,所以GET请求发送数据有长度的限制(这个是浏览器规定的,并不是RFC规定的)
POST请求一般没有请求长度的限制,因为请求数据在body上;
5、参数类型的区别:
GET请求只接受ASCII字符;
POST请求没有限制,支持更多的数据类型;
纠正一个误区,不是获取数据只能用GET请求,只是约定俗称通过GET来获取数据,只是约定并非规定,只要后端支持就可以。
6、其他区别
GET请求刷新浏览器或者回退没有影响;POST请求则会重新请求一遍;
GET请求通常是通过url地址请求;POST请求常见的则是form表单请求;
GET请求产生一个TCP数据包;POST请求产生两个TCP数据包;
具体就是:
1、GET请求时,浏览器会把 header 和 data 一起发送出去,服务器响应200(返回数据)
2、POST请求时,浏览器首先发送headers,服务器响应100 continue,浏览器再发送data,服务器响应200(返回数据)
如果把TCP传输比作汽车运输,那么GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
GET请求产生的URL地址可以被Bookmark;POST请求不可以;
GET请求会被浏览器主动cache;而POST请求不会,除非手动设置;
GET请求只能进行URL编码(appliacation-x-www-form-urlencoded);POST请求支持多种(multipart/form-data等)