一、联系
get和post是HTTP协议中的两种发送请求的方法,底层都是用TCP/IP协议进行通信的。
客户端ip发出请求,发出的请求数据包会通过tcp协议,经网络传输给远程服务端ip,服务端ip收到请求包之后,解析并处理请求包最后服务端会通过tcp协议将处理结果返回给客户端ip,用户便可以查看到想要的响应数据。
get和post本质上都是TCP链接, 之所以有get和post区分,是因为他们底层数据的传输都是基于tcp协议,需要通过HTTP的规则和浏览器/服务器的限制进行区分,使他们在应用过程中体现出不同。
HTTP给网络运输设定了好几个服务类别,有GET, POST, PUT, DELETE等等,HTTP规定,当执行GET请求的时候,要给请求包贴上GET的标签(设置method为GET),而且要求把传送的数据放在url中以方便记录。如果是POST请求,在请求数据包贴上POST的标签。
二、区别
最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。
最重点的区别是:GET产生一个TCP数据包,POST产生两个TCP数据包。也就是说,对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器第一次先将header发送过去,服务器若响应100 continue,确认服务器和网络没问题可以服务,才会再将真正的data数据提交,服务器响应200 ok。
看到这,你可能会认为POST消耗时间更多,因此GET比POST更有效,准备用GET来优化网站。但这是个大坑!为什么呢?
- 首先,get在url中传输参数有长度限制,post没有限制;这是因为浏览器和服务器对过大的url请求数据量处理起来成本过高,故对单次访问都做了限制,一旦超出限制就不会处理后续请求,这就导致即使GET带request body,其参数也不一定能被接收到,会返回null错误,所以对于长而多的请求参数直接用post即可;
- 其次,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以忽略,在网络环境差的情况下,两次包的TCP在验证数据包完整性上更有优势;反观get将参数直接暴露在URL上,非常不安全,因此不能用它来传递敏感信息;
- 最后,并不是所有浏览器都会在POST中发送两次包,Firefox只发送一次。
三、实际使用时
get:只为获取数据,同时加上请求参数的url不会特别大,且没有需要保密的字段,则用get请求;
post:为了提交数据,比如提交一些数据给后台保存、删除等,无论是否有一定数据量均可使用;另外,使用post提交请求来get数据也是可以的。