因为是做接口测试,所以接触http协议的时间最多,但是几年下来只能是理解http的皮毛,每次出去面试,面试官都会问以及经典的问题:
GET 与 POST的区别???
那么区别到底是什么呢?网上的答案有很多,如下:
1、GET请求参数直接拼接在url后面例如:url?params1=value1¶m2=value2
POST请求的参数则是放到body体里
2、浏览器会自动缓存GET请求,而POST不会自动缓存,除非手动设置。
3、GET 请求在浏览器中可回退,而POST会再次请求
4、GET请求时只能通过url编码,而POST则可以支持多种编码格式
5、GET的请求参数可以被完整保存到历史记录中,而POST不会被保留
6、GET产生的url可以被bookmark,而POST不可以
7、GET可接受的参数类型为ASCII字符,而POST没有限制
8、GET在ulr中传送的参数有长度限制??? 而POST没有限制
如果是一个真正了解http协议的面试官可能会微微一笑,告诉你:不完全对,并不是我们要的答案
so。。。。。。WTF。。。。。
那么GET 与 POST的真正的区别是什么呢?
如果要了解GET与POST的根本区别,首先要了解HTTP协议的是什么?
百度: http协议
维基百科:https://zh.wikipedia.org/wiki/超文本传输协议
HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。也就是说HTTP协议本身是基于TCP/IP协议。
所以无论是GET 还是 POST 都是一个标准的TCP链接,所以是两者能完成的事情是一样的,在GET请求中设置body 和 POST 的url中加入参数也是完全可行的
那么请问上面的那些区别是虾米?
举个例子:我们把每一个需要传送的TCP数据包比作汽车,但是生活中对于汽车有各种不同的需求,如果每一辆车都一样那么就会出现家用轿车运货,开着货车旅游的情况,为了做到一个规范,http就产生了。我们给家用的车命名为GET , 把 货车命名为POST ,分别贴上标签各做各的,将资源最大化
那么,其实家用轿车GET 也是可以用作货车的,这个就看个人爱好以及特殊的管制了。因为并不是所有的服务器都会在处理GET请求时取获取body中的数据,也就是说你可以在GET的body中放入数据,有的服务器会帮你check request body 而有的服务器可能就会直接忽略掉,同理POST也是一样。
至于最经典的问题:GET中的url长度限制? 这个好比你再汽车顶上放置了好多的货物,在卸货的时候不好处理,所以对车顶的货物做了控制,也就是说 GET方法本身是不对url长度做限制的,真正限制url长度的是浏览器和web服务器本身。目前业界大部分的浏览器限制url长度为2K, 而服务器限制为64K ,这个不是定值,各有不同。
以上只是表面层,那么更深一层的区别还是在于TCP层,真正的区别来了:
GET请求只会产生一个TCP包,也就是说浏览器会把所有的请求数据(header和data)一起发出去,服务器响应200时成功
POST 请求“可能” 会产生两个TCP包,第一次浏览器会先发送header,服务器响应100后,再次发送data
也就是说GET只需一次就将货物送到,而POST 会先告诉服务器我要发送数据,然后再把数据送过去,所以在调用时间上POST要稍微慢一点
那么是否可以把POST都换成GET呢?-----最好不要
原因:
1、在网络正常的情况下,一次调用跟两次调用基本无差别,就算是在网络较差的情况下,发送两次TCP包在数据完整性校验上有很大的优势
2、上面说了POST可能会产生两个TCP包,这是根据浏览器而定的,firefox浏览器就只会发送一次。
总结,GET 与 POST 在表现层并无差别,只是在TCP层存在一定的差异,各有各的实际用途,目的是将资源使用做到最优。