当第一次面试的时候被问到说一说get和post有什么区别。当时就说了一大堆很普遍很基础的答案,什么post比get安全,get比post传的少什么的。然而,面试官问,还有呢?
好家伙,面试完回去百度,整理了网上一堆的get和post的区别。整理如下:
- 从http标准来看,get比post安全,这里的安全是针对服务器而言的,get用于获取数据,不会引起数据的变化,并且是安全和幂等的。而post是有可能引起数据的变化。
- 从应用角度来看,get参数是放在URL后面(通过URL传递),参数直接暴露在URL上,所以不能用来传递敏感信息,而post提交的数据会放置在Request body中,get请求会被浏览器主动缓存post不会,除非手动设置。从这里看,post安全性比get高。GET请求只能进行url编码,而POST支持多种编码方式。 GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。GET在浏览器回退时是无害的,而POST会再次提交请求。 GET产生的URL地址可以被Bookmark,而POST不可以。对参数的数据类型,GET只接受ASCII字符,而POST没有限制。Get方式的提交顶多是1024字节,理论上post没有限制,可以传较大量的数据。Get一般是获取数据,post是向服务器提交修改的数据。
再然后呢,去面试的时候自然自信满满。结果,还有没有点别的,感觉有种答非所问的赶脚。
好吧,回去继续百度深造。结果是这样的:
GET和POST是什么?HTTP协议中的两种发送请求的方法。
HTTP是什么?HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。
HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
那所谓的区别呢?稍微总结了下(以下参考了在今日头条看到的一篇文章)。
运输快递需要车辆,而TCP就像车辆,但如果车辆全部按自己的想法走,交通就会瘫痪,所以交通规则HTTP诞生了。HTTP规定了运输方式:get、post、head、options、put等。当执行get请求时,车上贴get标签,货物放在上层运输。如果是post请求,车上贴post标签,货物放在下层运输。当然,get方式也可以把货物放在下层,但是这样是算get还是post呢?所以,HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。
而关于传递的参数大小问题,是这样的。
过大的数据量会增加运输成本,超出的部分,概不处理,那还不如乖按照规定走。所以,浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET可以带request body,也不能保证一定能被接收到哦。
GET和POST还有一个重大区别,简单的说:
GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)
好吧,至于这个答案。面试有待验证。
至于面试,老老实实回答还是有必要的,暂时为以下答案:
- get在浏览器回退时是无害的,而post会再次请求
- get产生的url地址可以被收藏,而post不会
- get请求会被浏览器主动缓存,而post不会,除非手动设置
- get请求只能进行url编码,而post支持多种编码方式
- get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留
- get 请求在url中传送的参数有长度限制,而post没有
- 对参数的数据类型,get只接受ascll字符,而post没有限制
- get比post更安全,因为参数直接暴露在url上,所以不能用来传递敏感信息
- get参数通过url传递,poet放在request body中
(记不住全部的,重点回答出1,2,5,6,9这几点即可)