本文已经收录到我的
Github
个人博客,欢迎大佬们光临寒舍:我的 Github 博客
面试官:『请你说下 post
和 get
的区别!』
看到这里,很多人禁不住内心的喜悦,嘴角微微上扬,然后强装镇定,拿出背好的拿手绝活,轻轻松松给出了「标准答案」:
GET
在浏览器回退时是无害的,而 POST
会再次提交请求。GET
产生的 URL
地址可以被书签收藏,而 POST
不可以。GET
请求会被浏览器主动 cache
,而 POST
不会,除非手动设置。GET
请求只能进行 url
编码,而 POST
支持多种编码方式。GET
请求参数会被完整保留在浏览器历史记录里,而 POST
中的参数不会被保留。GET
请求在 URL
中传送的参数是有长度限制的,而 POST
没有。GET
只接受 ASCII
字符,而 POST
没有限制。GET
比 POST
更不安全,因为参数直接暴露在 URL
上,所以不能用来传递敏感信息。GET
参数通过 URL
传递,POST 放在 Request body
中这时候,面试官邪魅一笑,他说:『GET 和 POST 本质上没有区别。』怎么办有点慌,是不是要回家等消息了。
别慌,让我们扒下 GET
和 POST
的外衣,坦诚相见吧!
PS:终于考完试了,摸鱼摸鱼!
GET
获取资源: 用来请求访问已被 URI
识别的资源,指定的资源经服务器端解析后返回响应内容POST
传输实体主体: 用来传输实体的主体 虽然用 GET
方法也可以传输实体的主体,但一般不用 GET
方法进行传输,而是用 POST
方法总的来说,他们是「HTTP
协议中的两种发送请求的方法」
HTTP
是基于 TCP/IP
的关于数据如何在万维网中如何通信的协议。
HTTP
的底层是 TCP/IP
。所以 GET
和 POST
的底层也是 TCP/IP
。GET
和 POST
能做的事情是一样一样的。你要给 GET
加上 request
body,给 POST
带上 url
参数,技术上是完全行的通的。
首先,我们来打几个比方
TCP——汽车
HTTP——交通规则
GET, POST
等方法——汽车的标签(生活中类比,标记为警车,救护车,消防车)
当执行 GET
请求的时候,要给汽车贴上GET
的标签(设置 method 为 GET),而且要求把传送的数据放在车顶上(url
中)以方便记录如果是 POST
请求,就要在车上贴上POST
的标签,并把货物放在车厢里当然,你也可以在 GET
的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在POST
的时候在车顶上也放一些数据,让人觉得傻乎乎的。
综上,HTTP
只是个行为准则,而 TCP
才是 GET
和 POST
怎么实现的根本
先说结论——「浏览器 / 服务器的限制」
首先,我们来打几个比方
不同的浏览器和服务器——运输公司
虽然理论上,你可以在车顶上无限的堆货物(url 中无限加参数)。但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。业界不成文的规定是,(大多数)浏览器通常都会限制 url 长度在 2K 个字节,而(大多数)服务器最多处理 64K 大小的 url。超过的部分,恕不处理。如果你用 GET 服务,在 request body 偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然 GET 可以带 request body,也不能保证一定能被接收到哦。
HTTP
的规定简单来说:
GET
产生一个 TCP
数据包POST
产生两个 TCP
数据包详细来说:
GET
方式的请求,浏览器会把 http header 和 data
一并发送出去,服务器响应 200
(返回数据)POST
,浏览器先发送 header
,服务器响应 100 continue
,浏览器再发送 data
,服务器响应 200
ok(返回数据)打个比方:
GET
只需要汽车跑一趟就把货送到了而
POST
得跑两趟,第一趟,先去和服务器打个招呼 “嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去
GET
比 POST
有效,为啥不直接用 GET
来替换 POST
?GET
与 POST
都有自己的语义,不能随便混用TCP
在验证数据包完整性上,有非常大的优点POST
中发送两次包,Firefox
就只发送一次如果文章对您有一点帮助的话,希望您能点一下赞,您的点赞,是我前进的动力
本文参考链接:
本文使用 mdnice 排版