简介
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 就只发送一次。