Get与Post的区别
下午回学校的走半路上的时候,接到了面试的电话,因为时间比较着急外加上面试时间不算长,然后背着书包,蹲在马路牙子上完成了面试,问了一点项目相关的问题,问了一个Ajax中请求数据中Get和Post两种方式的区别,只知道Get应用于较短的数据请求,Post则相反,然后接着问了Get短的范围是多少,问的懵逼了,准备问一下小哥这个问题的答案,然后时间比较紧他很快就挂电话了,所以自己回来查了查。
首先,
1、最直观的Get把数据请求的参数放在了URL中,而Post则是通过request body传递参数,
2、Get请求在浏览器进行回退的时候是无害的,即不会再次进行提交请求,但是Post回再次提交请求;
3、Get请求会被浏览器主动cache,而Post不会;
4、Get请求只能进行url编码,但是Post支持多种编码方式;
5、Get请求会被完整保留在浏览器的历史记录中,但是Post不会;
6、Get请求在URL中传送的参数是有长度限制的,而Post没有;(面试问的问题就是这个)
7、对于参数的类型,Get请求只是接受ASCII字符,Post没有限制;
8、Get请求会将传递的参数直接暴露在URL中,不能够传递敏感信息,Post则不是;
然后,来看看Get请求数据长度的限制。其实在Http中,对于Get长度是没有限制的,之所以产生限制,是因为不同浏览器以及服务器对它的限制。
浏览器的限制,超过该长度的字符以后,提交按钮会无效导致无法提交数据请求。
- 1、IE:最大URL字符长度2083个字符;
- 2、Firefox:最大URL字符长度65536个字符;
- 3、Safari:最大URL字符长度80000个字符;
- 4、Opera:最大URL字符长度190000个字符;
- 5、Chrome:最大URL字符长度8192个字符;
服务器的限制:
1、Apache:最大URL长度8192个字符;
2、IIS:最大URL长度16384个字符;
这是Get与Post的一些基本区别,然后,还有更深层的区别。
其次,
Get和Post本质上还是TCP链接,只不过TCP相当于一辆卡车,当使用Get的时候就相当于把货物放在了车顶上,过往的人都能看见,但是使用Post的时候,相当于把货物放在了车厢中,过往的人是看不见的,所以会比较安全。虽然在Get的时候也可以在车厢中放一点货物,但是这不好,在Post的时候在车顶放一些货物会觉得有毛病,车厢内可以放为什么要放在车顶?另外Get的请求如果超出浏览器限制的范围就相当于超载了,警察叔叔会把你的车扣住,你要是不卸一些货你是不能走的,这就意味着请求不会被提交了,但是这货物很珍贵不能卸,所以就死循环没办法走了。
接着,
对于Get请求来说,会产生一个数据包进行发送,但是Post会产生两个TCP数据包;
Get请求中,浏览器会把http header和data一起发送出去,服务器响应200返回数据即可;
Post请求中,首先要发送header过去打招呼说你好,我要给你发送数据了,然后服务器收到也打招呼,返回100给浏览器说好的,然后浏览器再将data发送过去,服务器收到以后做出响应返回200;
因为Post分为两步进行数据发送,时间上会比Get长一点,所以Get可能会比Post更有效,但是在网速环境十分优良的情况下,这个区别其实不大,但是在网络较差的情况下,这个区别就会很明显。
最后,
并不是所有的Post请求都发送两次包,Firefox就只发一次。。。
嗯,都是不同浏览器厂商惹的祸,坑着我们这些开发者。