GET和POST的区别

深入了解GET和POST请求的区别!

GET和POST的区别_第1张图片直观来说区别:
GET把参数放在URL里面,而POST放在请求体(request body)中
GET在浏览器回退时候是无害的,而POST会再次请求
GET请求只能进行url编码,而POST可以支持多种编码
GET请求在URL中传递的参数是有长度限制的,而POST没有
GET请求的参数会被完整保存在浏览器历史记录里面,而POST参数不会被保留
GET请求的参数类型只接受ASCII字符,而POST没有限制
GET请求没有POST请求安全,因为参数直接暴露在URL上面 所以不能用来传递敏感信息
GET请求会被浏览器主动cache,而POST不会,除非手动设置
GET产生的URL地址可以被Bookmarks,而POST不可以

深度解析:
GET和POST本质上没有区别的 都是HTTP协议中的两种发送请求的方式,HTTP就是基于TCP/IP的关于数据如何在万维网中如何通信的协议,HTTP底层是TCP/IP,所以说GET和POST的底层也就是TCP和IP,GET和POST能做的事情是一样的,你给GET加上请求体,给POST带上URL参数,技术上面都是行得通的。
GET和POST的区别_第2张图片
举个栗子,在万维网世界中TCP就像是一个汽车,我们用TCP来运输数据,他很可靠,从来不会发生丢件少件的现象,但是如果路上跑的全是一模一样的汽车,那么看起来就是一团混乱,送急件的汽车可能被前面满载货物的汽车堵在路上,整个交通系统一定会瘫痪的,为了避免出现这种情况,交通规则HTTP诞生了,HTTP给汽车运输设定了好几个服务类别,GET,POST,PUT,DELETE等等。HTTP中规定当执行了GET请求的时候,要给汽车贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(URL)以便方便记录,如果是POST请求,这时候就要在车上贴一个POST的标签,并把货物放在车厢里。当然你也可以在GET的时候在车厢内偷偷藏一点货物,当然这样子并不光彩,你也可以再POST时候在车顶上面放一些数据,让别人觉得傻乎乎的。HTTP只是一个行为准则,而TCP才是GET和POST怎么实现的基本。
但是我们只看到HTTP请求对GET和POST参数的传送渠道(URL还是request body)提出了对应的要求,那么,关于参数的限制又是从哪里来的呢?
GET和POST的区别_第3张图片
举个栗子,在万维网世界中还有另一个重要的角色:运输公司.不同的浏览器(发送HTTP请求)和服务器(接受HTTP请求)就是不同的运输公司,虽然理论上,你可以在车顶上无限堆放货物(在URL中无限加参数)。但是运输公司又不傻,装货和卸货都有很大的成本,他们会限制单次运输量来控制风险,数据量太大对于浏览器和服务器都是有很大负担的.业务上不成文的规定是,(大多数)浏览器通常会限制URL的长度在2K个字节,而(大多数)服务器最多处理64K大小的URL。超过的部分,恕不处理.如果你用GET服务,在request body 偷偷藏了数据,不同的服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器会直接忽略,所以说,虽然GET可以带request body ,也不一定保证一定能够被接收到的。
所以说,GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器,服务器的限制,导致他们在应用过程中体现出一些不同。
但是他们有一个重大的区别,嘻嘻:GET产生一个TCP数据包,POST产生两个TCP数据包。
说详细一点就是:对于GET方式的请求,浏览器会把http header和data一并发出去,服务器响应200(返回数据);
而对于POST请求,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200,ok(返回数据)。
也就是说GET只需要汽车跑一趟就能把货送到,而POST得跑两趟,第一趟先和服务器打个招呼,“嗨,我等下要送一批货物来,你们打开门来迎接我”,然后再回头把货送过去。
因为POST需要两步,时间上消耗地多一些,看起来GET比POST更有效,因此Yahoo团队有推荐用GET替换POST来优化网站性能,但是这是一个坑!!!为什么??
1.GET和POST都有自己的语义,不能随便混用
2.据研究,在网络环境好的情况下,发送一次包的时间和发送两次包的时间差基本可以无视,而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
3.并不是所有的浏览器都会在POST中发送两次包,Firefox就只发送一次。
GET和POST的区别_第4张图片

你可能感兴趣的:(Java,GET和POST,Java面试题)