Http协议之"get和post的区别"

来源---面试中常问的一个问题:get数据请求方式与post的区别

比较老的历史:HTTP与服务器交互的方式为put,delete,post,get

分别对应增,删,改查。

从字面上看,get是获取数据,post是修改数据。

那么现在还是这样吗?(思考)

先上两者的区别吧:

  1. get把数据放在url上,即HTTP协议头上;而post把数据放在HTTP请求体内(request body)。
  2. get提交的数据最大为2k(原则上url长度无限制,限制实际上取决于浏览器,大多数浏览器从都会限制url长度在2k个字节);post理论上没有限制,实际中,IIS4中最大量为80K,IIS5中为100KB。
  3. get产生一个TCP数据包,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而post会产生两个数据包,浏览器先发送header,服务器响应100 continue,浏览器再次发送data,服务器响应200 OK(返回数据)。
  4. get请求会被浏览器主动cache;而post不会,除非手动设置。
  5. get请求参数会被完整保留在浏览器历史记录里;而post中的参数不会被保留。
  6. get只接受ASCII字符的参数的类型;而post没有限制。

对以上总结的解答:

1、为啥get比post传送数据快

1)post请求包含更多的请求头

解释:post需要在请求体中包含部分数据,多了一些数据描述部分的首部字段(如,content-type)

2)post在真正接收数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据(比get方式多了一个等待100 Continue的过程)

post请求过程:

  1. 浏览器请求tcp连接(第一次握手)
  2. 服务器响应浏览器的tcp连接(第二次握手)
  3. 浏览器确认,并发送post请求头(第三次握手,这个请求头报文比较小,所以http会在此时进行第一次数据分析发送)
  4. 服务器返回100 Continue响应
  5. 浏览器发送数据
  6. 服务器返回200 OK响应

get请求过程:

  1. 浏览器请求tcp连接(第一次握手)
  2. 服务器响应浏览器的tcp连接(第二次握手)
  3. 浏览器确认,并发送get请求头数据(第三次握手)
  4. 服务器返回200 OK响应

3)get会缓存数据,而post不会

如果连续两次以上数据请求,get方式在第二次时请求数据时,将静态数据(如html页面,图片等)缓存下来,而post则不会,它会每次去请求。

4)post方式不能径向管道化传输

http权威指南中是这样说的:http的一次会话需要先建立tcp连接(大部分是tcp,但是其他安全协议也是可以的),然后才能通信,如果 每次连接都只进行一次http会话,那这个连接过程占的比例太大了!于是出现了持久连接:在http/1.0+中是connection首部中添加keep-alive值,在http/1.1中是在connection首部中添加persistent值,当然两者不仅仅是命名上的差别,http/1.1中,持久连接是默认的,除非显示在connection中添加close,否则持久连接不会关闭,而http/1.0+中则恰好相反,除非显示在connection首部中添加keep-alive,否则在接收数据包后连接就断开了。 
出现了持久连接还不够,在http/1.1中,还有一种称为管道通信的方式进行速度优化:把需要发送到服务器上的所有请求放到输出队列中,在第一个请求发送出去后,不等到收到服务器的应答,第二个请求紧接着就发送出去,但是这样的方式有一个问题:不安全,如果一个管道中有10个连接,在发送出9个后,突然服务器告诉你,连接关闭了,此时客户端即使收到了前9个请求的答复,也会将这9个请求的内容清空,也就是说,白忙活了……此时,客户端的这9个请求需要重新发送。这对于幂等请求还好(比如get,多发送几次都没关系,每次都是相同的结果),如果是post这样的非幂等请求(比如支付的时候,多发送几次就惨了),肯定是行不通的。 
所以,post请求不能通过管道的方式进行通信!很有可能,post请求需要重新建立连接,这个过程不跟完全没优化的时候一样了么?所以,在可以使用get请求通信的时候,不要使用post请求,这样用户体验会更好,当然,如果有安全性要求的话,post会更好。管道化传输在浏览器端的实现还需考证,貌似默认情况下大部分浏览器(除了opera)是不进行管道化传输的,除非手动开启!

2、get传输参数有最大长度限制

解释:

  1. http协议并为规定get和post的长度限制
  2. get方式有长度限制是因为浏览器和web服务器限制了URL的长度
  3. 不同的浏览器和web服务器,限制的最大长度不一样
  4. 要支持IE,则最大长度为2083byte,若支持Chrome,则最大长度为8182byte

3.各个浏览器和web服务器的最大长度总结 
浏览器 
(1)IE:IE浏览器(Microsoft Internet Explorer) 对url长度限制是2083(2K+53),超过这个限制,则自动截断(若是form提交则提交按钮不起作用)。 
(2)firefox:firefox(火狐浏览器)的url长度限制为 65536字符,但实际上有效的URL最大长度不少于100,000个字符。 
(3)chrome:chrome(谷歌)的url长度限制超过8182个字符返回本文开头时列出的错误。 
(4)Safari:Safari的url长度限制至少为 80 000 字符。 
(5)Opera:Opera 浏览器的url长度限制为190 000 字符。Opera9 地址栏中输入190000字符时依然能正常编辑。 
服务器 
(1)Apache:Apache能接受url长度限制为8 192 字符 
(2)IIS:Microsoft Internet Information Server(IIS)能接受url长度限制为16384个字符。这个是可以通过修改的(IIS7) 

猜你喜欢

转载自blog.csdn.net/weixin_38664232/article/details/85218479