浅谈get请求和post请求的区别

  • 今天所听闻的get、post的请求区别,有点颠覆之前对他们的认知,作为第一篇文章发布并巩固一下
  • 一、如果今天之前,有面试官问我:“get、post请求区别是什么?”
  • 二、今天之后,有面试官再问我这个问题,我会在结尾加一段‘正确答案’
  • 三、此时,又有同学会问:“既然他俩本质上是一样的,为啥要多此一举,创建这么多请求方式?”


今天所听闻的get、post的请求区别,有点颠覆之前对他们的认知,作为第一篇文章发布并巩固一下

一、如果今天之前,有面试官问我:“get、post请求区别是什么?”

1、从传递参数大小来讲:

post请求传递的参数是在请求体当中,所以它的大小理论上是没有限制的,但是实际上IIS4中最大的存放量为80KB,IIS5中为100KB;
get请求传递参数的方式是在url后面拼接参数,而实际上,URL不存在参数上限的问题,HTTP协议规范也没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。所以它受浏览器url地址栏的限制,通常url地址栏的大小限制是2KB。

2、从安全性来讲:

post请求传递参数放在请求体当中,没有写在表面,所以相对安全;
get请求传递的参数直接拼接在地址栏后面,所以相对不安全;
PS:其实我觉的,这个安全和不安全只是相对来说的,如果有心人通过截取你的请求来读取请求体里的内容,还是一样没有任何安全可言,只是一个肉眼可见一个肉眼不可见罢了。不过还有一点有关安全的,就是get请求时,传递的参数也会完整的保存在历史纪录里边,而post请求不会,所以我觉得从这点看更好分辨安全性!

3、从参数的数据类型来说:

因为url地址必须是ASCII编码的,所以get请求也必须是ASCII编码,而post请求没有这种限制。(如果url中存在非ASCII编码格式的数据,浏览器会将这些数据强制转码,得到没有非ASCII码的URL。一般转码都是将非ASCII码的字符转换为utf-8字符集的字节,并在每个字节前加上%,完成转码)

4、从传递的数据包个数来说:

get请求时,产生一个TCP数据包,浏览器会将http header和data一起放进数据包中,进行传输。
post请求时,会产生两个数据包,浏览器会先发送包含header的数据包,然后等待返回是否成功,如果成功,那么再发送第二个包含data的TCP包,这样可以减少资源的浪费(如果访问不成功,就不发送数据),但是也有例外,并不是所有的post都发送两个数据包,火狐浏览器还是发送一个数据包。

二、今天之后,有面试官再问我这个问题,我会在结尾加一段‘正确答案’

其实post和get底层的【报文格式】区别不大(几乎没有区别),他们都是HTTP协议中的请求方法。底层实现都是基于TCP/IP协议。
之前所说的区别(安全、数据量、参数位置、参数大小…)只是浏览器厂家根据约定,做的限制而已。就比如说,你在使用get的时候,你也可以在请求体中存放一些参数,你在使用post的时候,你也可以在url后边拼接参数,这样不符合要求,但是大部分都可以正常使用(之所以说大部分,是因为get请求在请求体存放数据时,有些服务器会帮你读取,而有些会直接将请求体中的参数忽略)。

三、此时,又有同学会问:“既然他俩本质上是一样的,为啥要多此一举,创建这么多请求方式?”

其实,创建这么多请求方式,只是为了迎合当时盛行的RESTfull风格(编码格式),让程序员可以通过请求方式就能够判定是什么请求动作(比如:get(查),post(增),delete(删),put(改)),但这种RESTfull风格并不是强制要求的,无论是get或者post都有增删改查的能力。

以上是我的一些观点与看法,如存在争议请留言告诉我。