【计算机网络】面试常问:HTTP协议中GET,POST,PUT方法的区别

我在前面博客:详解HTTP协议中讲到HTTP协议的一些方法,但是被面试官问到最多的是get和post方法的区别,虽然很多人都知道,但是并不能让面试官满意,所以我在这里就重点比较获取数据的三种方法:GET,POST,PUT方法的区别

1. get 和 post 方法比较

get和post方法主要有以下五点区别:

  1. 安全性:post方法更安全
  2. 传输资源的大小:post能传输的资源更大
  3. 传输资源的数据类型:post能传输的数据类型更多
  4. 应用场景:post用于写入和修改数据,get用于搜索和查询
  5. 获取资源的速度:get更快!! 面试官心里最想让你说的一点

下面,我就针对上面分析到的五点,依次介绍一下:

post 方法获取资源更安全

GET方法是使用URL传参的,而POST方法是在报文主体中传参,这也就意味着POST在传参时更安全。如下图所示,用GET方法请求时,用户的私人信息会暴露在URL中, 这存在很大隐患。
在这里插入图片描述
这里需要注意一点,直接使用HTTP协议发送的数据,是没有经过加密的,也就是说只要是有人想截取到报文,无论get还是post方法并没有区别,所以在HTTP协议中我们应该说post方法更私密,因为它将参数 “ 藏 ” 的更深。

post 方法能传输的资源更大

由于传参的方式不同导致传输资源的大小也不同。get方法请求时由于浏览器对地址长度的限制而导致传输的数据有限制,而post方法在报文中就不会有这个问题。
这里对于地址长度的限制要声明一点,http协议并未规定get和post的长度限制,get的最大长度限制是因为浏览器和web服务器限制了URL的长度,不同的浏览器对地址长度的限制也是不同的。要强调的是,这个长度的限制不是对于参数长度的限制,而是对于整个URL的长度。
下面是常见的web浏览器和服务器对于get最大传参长度限制:

  • IE浏览器:对url长度限制是2083(2K+53),超过这个限制,则自动截断
  • firefox:firefox(火狐浏览器)的url长度限制为 65536字符,但实际上有效的URL最大长度不少于100,000个字符
  • chrome(谷歌)的url长度限制超过8182个字符返回错误
  • Apache服务器:Apache能接受url长度限制为8192 字符

post 方法能传输的数据类型更多

GET方法只能传输ASCII码值(0-127),而POST可以传输任意数据类型

应用场景不同

post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作(淘宝,支付宝的搜索查询都是get提交),目的是资源的获取,读取数据。

get 方法获取资源更快,原因有以下四点:

  • post请求时包含了更多的请求头,这是必然的,因为post请求在body中
  • 最重要的一点:post在真正接收数据前会先将请求头发送给服务器进行确认,收到服务器回复100的确认码后,才开始发送正文;但是get会在第三次握手时就交付数据。
    并有网友测试过:get的总耗是post的2/3左右
post请求的过程:
(1)浏览器请求tcp连接(第一次握手)
(2)服务器答应进行tcp连接(第二次握手)
(3)浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
(4)服务器返回100 Continue响应
(5)浏览器发送数据
(6)服务器返回200 OK响应

get请求的过程:
(1)浏览器请求tcp连接(第一次握手)
(2)服务器答应进行tcp连接(第二次握手)
(3)浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
(4)服务器返回200 OK响应
  • get会将请求过的数据缓存起来,而post不会
    所以对于同一个资源请求多次时,get方法只有在第一次的时候和post时间相同,之后的话get方法会直接从缓存区中获取,而post方法必须再次发起完整请求。
  • post不能进行管道化传输
    这种技术是基于HTTP长连接的技术,他是为了提高效率而出现的。本来对于客户端来说只有收到了上一个请求的回应才能发送下一个请求,但是对于一张需要请求多次的网页来说这种方式未免效率太低。所以此技术是把需要发送到服务器上的所有请求放到输出队列中,在第一个请求发送出去后,不等到收到服务器的应答,第二个请求紧接着就发送出去。这种技术有点像连续的ARQ协议,但是这种技术存在缺陷,如果一个管道中有10个连接,在发送出9个后,突然服务器告诉你,连接关闭了,此时客户端即使收到了前9个请求的答复,也会将这9个请求的内容清空,也就是说,白忙活了……此时,客户端的这9个请求需要重新发送。这对于非幂等性的POST来说存在非常大的问题,重新发送请求你就不能保证状态会发生什么样的变化,尤其是在支付时。所以一般的浏览器都不会对POST方法使用管线化技术,也就意味着请求速度绝比不上GET方法。

2. post和put比较
首先了解一下幂等性:幂等性可以简单的理解为同一操作执行一次,以及后续的多次执行,对系统状态的影响是一致的。
而对于上述我们所讲的方法中,GET,PUT,DELETE都是幂等操作,而POST不是。PUT请求的幂等性可以这样理解,将A修改为B,它第一次请求值变为了B,再进行多次此操作,最终的结果还是B,与一次执行的结果是一样的,所以PUT是幂等操作。 POST不是幂等操作,因为一次请求添加一份新资源,二次请求则添加了两份新资源,多次请求会产生不同的结果,因此POST不是幂等操作。

这里举个简单的例子,如果你在CSDN下发布一篇博客,使用PUT方法不管在发布时请求多少次最后都只产生一篇博客,而如果使用POST方法则可能会产生多篇相同的博客,相信不难理解,所以这也就是为什么上一小节中POST通常不会使用管线化技术的原因

对于三种方法的理解,我已经全部交出来了,有其他理解的可以留言区讨论~

猜你喜欢

转载自blog.csdn.net/ly_6699/article/details/100123164