共计 2247 个字符,预计需要花费 6 分钟才能阅读完成。
GET 和 POST 是 HTTP 申请的两种根本办法,要说它们的区别,接触过 WEB 开发的人都能说出一二。
最直观的区别就是 GET 把参数蕴含在 URL 中,POST 通过 request body 传递参数。
你可能本人写过无数个 GET 和 POST 申请,或者曾经看过很多权威网站总结出的他们的区别,你十分分明晓得什么时候该用什么。
当你在面试中被问到这个问题,你的心田充斥了自信和喜悦。
你轻轻松松的给出了一个“标准答案”:
GET 在浏览器回退时是有害的,而 POST 会再次提交申请。
GET 产生的 URL 地址能够被 Bookmark,而 POST 不能够。
GET 申请会被浏览器被动 cache,而 POST 不会,除非手动设置。
GET 申请只能进行 url 编码,而 POST 反对多种编码方式。
GET 申请参数会被残缺保留在浏览器历史记录里,而 POST 中的参数不会被保留。
GET 申请在 URL 中传送的参数是有长度限度的,而 POST 么有。
对参数的数据类型,GET 只承受 ASCII 字符,而 POST 没有限度。
GET 比 POST 更不平安,因为参数间接裸露在 URL 上,所以不能用来传递敏感信息。
GET 参数通过 URL 传递,POST 放在 Request body 中。
(本标准答案参考自 w3schools)
“很遗憾,这不是咱们要的答复!”
请通知我假相。。。
如果我通知你 GET 和 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 就像汽车,咱们用 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 还是 requrest body)提出了要求。“标准答案”里对于参数大小的限度又是从哪来的呢?
在我大万维网世界中,还有另一个重要的角色:运输公司。不同的浏览器(发动 http 申请)和服务器(承受 http 申请)就是不同的运输公司。尽管实践上,你能够在车顶上有限的堆货物(url 中有限加参数)。然而运输公司可不傻,装货和卸货也是有很大老本的,他们会限度单次运输量来管制危险,数据量太大对浏览器和服务器都是很大累赘。业界不成文的规定是,(大多数)浏览器通常都会限度 url 长度在 2K 个字节,而(大多数)服务器最多解决 64K 大小的 url。超过的局部,恕不解决。如果你用 GET 服务,在 request body 偷偷藏了数据,不同服务器的解决形式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器间接疏忽,所以,尽管 GET 能够带 request body,也不能保障肯定能被接管到哦。
好了,当初你晓得,GET 和 POST 实质上就是 TCP 链接,并无差别。然而因为 HTTP 的规定和浏览器 / 服务器的限度,导致他们在利用过程中体现出一些不同。
你认为本文就这么完结了?
咱们的大 BOSS 还等着出场呢。。。
这位 BOSS 有多神秘?当你试图在网上找“GET 和 POST 的区别”的时候,那些你会看到的搜寻后果里,从没有提到他。他到底是什么呢。。。
GET 和 POST 还有一个重大区别,简略的说:
GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包。
长的说:
对于 GET 形式的申请,浏览器会把 http header 和 data 一并发送进来,服务器响应 200(返回数据);
而对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。
也就是说,GET 只须要汽车跑一趟就把货送到了,而 POST 得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,而后再回头把货送过来。
因为 POST 须要两步,工夫上耗费的要多一点,看起来 GET 比 POST 更无效。因而 Yahoo 团队有举荐用 GET 替换 POST 来优化网站性能。但这是一个坑!跳入需谨慎。为什么?
- GET 与 POST 都有本人的语义,不能轻易混用。
- 据钻研,在网络环境好的状况下,发一次包的工夫和发两次包的工夫差异根本能够忽视。而在网络环境差的状况下,两次包的 TCP 在验证数据包完整性上,有十分大的长处。
- 并不是所有浏览器都会在 POST 中发送两次包,Firefox 就只发送一次。