区别一:幂等性
1、由于 GET 是读,POST 是写,所以 GET 是幂等的,POST 不是幂等的;
2、由于 GET 是读,POST 是写,所以用浏览器打开网页会发送 GET 请求,想要 POST 打开网页要用 form 标签;
3、由于 GET 是读,POST 是写,所以 GET 打开的页面刷新是无害的,POST 打开的页面刷新需要确认;
4、由于 GET 是读,POST 是写,所以 GET 结果会被缓存,POST 结果不会被缓存;
5、由于 GET 是读,POST 是写,所以 GET 打开的页面可能会被书签收藏,POST 打开的不会。
区别二:请求参数
1、通常,GET 请求参数放在 url 里面,POST 请求数据放在 body(消息体)里面。GET 请求参数也可以放在消息体中,但是浏览器一般不会发送 GET 请求的消息体;
2、GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息(由于 HTTP 是一个明文协议,每个 HTTP 请求和返回的数据在网络上都是明文传播,无论是 url、header 还是 body,只要在网络节点抓包,就能获得完整的数据报文,要防止泄密,只能用 HTTPS(用 SSL 协议协商出的密钥加密明文 HTTP 数据));
3、GET 请求参数放在 url 里是有长度限制的(浏览器自己做的限制),而 POST 放在 body 里没有长度限制(如果数据过大,超过几十兆,可能也会传不了)。
区别三:TCP packet(数据包)
1、GET 发送请求头,产生一个 TCP 数据包,POST 发送请求头和消息体,产生两个或以上 TCP 数据包(在 HTTP 协议中并没有明确说明 POST 会产生两个数据包。之所以会发两个数据包,则是因为:如果服务器先收到“请求头”,则会对其进行校验,如果校验通过,则会回复客户端“100-Continue”,客户端再把“请求体”发给服务器。如果请求被拒了,服务器就回复个 400 之类的错误,这个交互就终止了。这样做的优点是可以避免浪费宽带传输请求体,但是代价就是会多一次 Round Trip。如果刚好请求体的数据也不多,那么一次性全部发给服务器可能反而更好。所以说,这和 POST 完全没有关系,只是基于两端的一种优化手段罢了。)