当前位置: 首页 > 科技观察

脱掉GET和POST的外衣,坦诚相见吧!

时间:2023-03-18 11:15:16 科技观察

GET和POST是HTTP请求的两种基本方法。如果要说他们的区别,接触过Web开发的人都能说一二。最直观的区别是GET在URL中包含参数,而POST通过请求体传递参数。你可能自己写过无数GET和POST请求,或者看过很多权威网站总结的区别,你就知道什么时候用。当你在面试中被问到这个问题时,你的内心充满了自信和喜悦。你游刃有余地给出了一个“标准答案”:浏览器回退时GET无害,POST会重新提交请求。GET生成的URL地址可以Bookmarked,不能POST。GET请求会被浏览器主动缓存,但是POST不会,除非手动设置。GET请求只能进行url编码,而POST支持多种编码方式。GET请求参数会完整的保存在浏览器的历史记录中,而POST中的参数不会被保存。GET请求的URL中传递的参数有长度限制,但是没有POST。对于参数的数据类型,GET只接受ASCII字符,而POST没有限制。GET不如POST安全,因为参数直接暴露在URL上,不能用于传递敏感信息。GET参数通过URL传递,POST放在Requestbody中。“不幸的是,这不是我们要找的答案!”请告诉我真相……如果我告诉你GET和POST之间本质上没有区别,你会相信我吗?让我们剥离GET和POST并且老实说吧!什么是GET和POST?HTTP协议中发送请求的两种方法。什么是HTTP?HTTP是一种基于TCP/IP的协议,用于在万维网上传输数据。HTTP的底层是TCP/IP。所以GET和POST底层也是TCP/IP,也就是说GET/POST都是TCP连接。GET和POST可以做同样的事情。GET需要加一个requestbody,POST需要加一个url参数,技术上是完全可行的。那么,“标准答案”有哪些不同呢?在我的万维网大世界中,TCP就像一辆汽车。我们使用TCP来传输数据。非常可靠,从不丢失或丢失几件。但是,如果路上到处都是看起来一模一样的汽车,世界就会变得一团糟。一辆传递紧急信息的汽车可能会被前面一辆满载货物的汽车挡住,整个交通系统肯定会瘫痪。为了防止这种情况发生,流量规则HTTP诞生了。HTTP为车辆传输设置了几个服务类,包括GET、POST、PUT、DELETE等。HTTP规定执行GET请求时,汽车必须标记为GET(设置方法为GET),并且要求传输的数据放在汽车的车顶上(在url中),方便记录。如果是POST请求,需要在车上贴上POST标签,把货物放到车上。当然你也可以在GET的时候偷偷的在隔间里藏一些货,但是这样很丢人;POST的时候还可以在车顶放一些数据,让人觉得很蠢。HTTP只是一种行为准则,而TCP是GET和POST如何实现的基础。但是,我们只看到GET和POST参数对传递通道(url或请求正文)的HTTP要求。“标准答案”中参数大小的限制从何而来?在我的万维网世界里,还有一个重要角色:运输公司。不同的浏览器(发起http请求)和服务器(接受http请求)是不同的发货公司。虽然理论上可以在楼顶无限堆货(在url中添加无限参数)。但是运输公司并不傻。装卸也花费不少。他们会限制单次运输的数量来控制风险。过多的数据对浏览器和服务器都是很大的负担。业界不成文的规则是(大多数)浏览器通常将url的长度限制为2K字节,而(大多数)服务器可以处理最大64K大小的url。超出部分将不予处理。如果你使用GET服务,偷偷的把数据隐藏在请求体中,不同的服务器会有不同的处理方式。有的服务器会帮你卸载数据,读出数据,有的服务器则直接忽略。因此,GET虽然可以携带请求体,但并不能保证一定会被接收到。好了,现在你知道了,GET和POST本质上都是TCP连接,没有区别。但是,由于HTTP法规和浏览器/服务器的限制,它们在应用过程中表现出一些差异。你认为这是这篇文章的结尾吗?我们的大BOSS还在等着出现呢……这个BOSS到底有多神秘?当你试图在互联网上寻找“GET和POST的区别”时,你会看到的那些搜索结果中,从来没有提到过他。他是什么?GET和POST之间还有一个重要的区别。简单的说:GET生成一个TCP数据包;POST生成两个TCP数据包。长话短说:对于GET请求,浏览器会将http头和数据一起发送,服务器会响应200(返回数据)。对于POST,浏览器先发送header,服务器响应100continue,浏览器发送数据,服务器响应200ok(返回数据)。换句话说,GET只需要一辆车来运送货物,而POST则要走两趟。第一趟,先去和服务员打声招呼,“嘿,我待会要发一批货,打开。门口等我”,然后转身送货。因为POST需要两步,耗时稍多,所以GET似乎比POST效率更高。因此,雅虎团队建议将POST替换为GET以优化网站性能。但这是一个陷阱!跳槽时需要谨慎,为什么?GET和POST有自己的语义,不能随便混用。据研究,在网络环境好的情况下,发送一个数据包和发送两个数据包的时间差异基本可以忽略不计。在网络环境较差的情况下,有两个数据包的TCP在验证数据包的完整性方面有很大的优势。并非所有浏览器都在POST中发送数据包两次,Firefox只发送一次。现在,当面试官问你“GET和POST的区别”时,你心里是不是这样的?作者:在路上编辑:陶家龙来源:cnblogs.com/logsharing/p/8448446.html