午间邂逅 | post 和 get 的兄弟情深
前言
本文已经收录到我的
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 和 POST 是什么?
GET获取资源: 用来请求访问已被URI识别的资源,指定的资源经服务器端解析后返回响应内容POST传输实体主体: 用来传输实体的主体 虽然用GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是用POST方法
总的来说,他们是「HTTP 协议中的两种发送请求的方法」
三、HTTP 是啥?
HTTP 是基于 TCP/IP 的关于数据如何在万维网中如何通信的协议。
HTTP 的底层是 TCP/IP。所以 GET 和 POST 的底层也是 TCP/IP。GET 和 POST 能做的事情是一样一样的。你要给 GET 加上 request body,给 POST 带上 url 参数,技术上是完全行的通的。
四、你能理清 HTTP, TCP/IP,GET/POST 三者的关系吗?
首先,我们来打几个比方
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,也不能保证一定能被接收到哦。
六、GET 和 POST 的区别从何而来?
HTTP的规定浏览器 / 服务器的限制
七、GET 和 POST 的重大区别
7.1 重大区别是什么?
简单来说:
GET产生一个TCP数据包POST产生两个TCP数据包
详细来说:
对于 GET方式的请求,浏览器会把http header 和 data一并发送出去,服务器响应200(返回数据)对于 POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200ok(返回数据)
打个比方:
GET只需要汽车跑一趟就把货送到了而
POST得跑两趟,第一趟,先去和服务器打个招呼 “嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去
7.2 既然 看起来 GET 比 POST 有效,为啥不直接用 GET 来替换 POST ?
GET与POST都有自己的语义,不能随便混用在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视 而在网络环境差的情况下,两次包的 TCP在验证数据包完整性上,有非常大的优点并不是所有浏览器都会在 POST中发送两次包,Firefox就只发送一次

如果文章对您有一点帮助的话,希望您能点一下赞,您的点赞,是我前进的动力
本文参考链接:
99%的人都理解错了HTTP中GET与POST的区别 『图解 HTTP』
本文使用 mdnice 排版
午间邂逅 | post 和 get 的兄弟情深的更多相关文章
- APP邂逅即时通讯云,让你的手机APP聊起来
#推荐活动# #线下沙龙# 明天下午在IC咖啡 —— <APP邂逅即时通讯云,让你的手机APP聊起来>, http://url.cn/Y8sYo5
- “NOT_IN”与“NULL”的邂逅
今天处理了一个因“NOT IN”与“NULL”邂逅导致的问题,值得思考和总结,记录在此,供参考.(感谢John抛出的问题) 我们以实验的形式先再现一下这个问题,然后对其分析,最后给出几种解决方案. 1 ...
- HDU 2897 邂逅明下(巴什博奕)
题意: 每行有三个数字n,p,q,表示一堆硬币一共有n枚,从这个硬币堆里取硬币,一次最少取p枚,最多q枚,如果剩下少于p枚就要一次取完.两人轮流取,直到堆里的硬币取完,最后一次取硬币的算输.对于每一行 ...
- HDU 2897 邂逅明下 (简单博弈,找规律)
邂逅明下 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- thinkjs与Fine Uploader的邂逅
最近在做一个内部系统,需要一个无刷新的上传功能,找了许久,发现了一个好用的上传工具-Fine Uploader,网上也有不少关于它的介绍,对我有不少的启发,结合我的使用场景简单的介绍一下它与t ...
- 当php邂逅windows通用上传缺陷
早上逛乌云发现了PKAV大牛的一篇文章,针对php和windows文件上传的分析,思路很YD,果断转之与大家分享. 虽然此文可能有许多的限制条件,但是如果你认真阅读会发现,其实还是比较实用的. 另外一 ...
- 邂逅Sass和Compass之Compass篇
本文主要讲解Compass的内容,众所周知Compass是Sass的工具库,如果对Sass不甚了解的同学可以移步 邂逅Sass和Compass之Sass篇 Sass本身只是一个“CSS预处理器”,Co ...
- 邂逅明下(巴什博弈+hdu2897)
H - 邂逅明下 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- baidu手机输入法:邂逅"吹神"的声场漫游
"十年,好久不见,兄妹,所有还好?年月如歌,你的背包.却仍然没有筛选.装满红玫瑰.人来人往,爱情搬运,纵使我成了K歌之王.也谢谢你.依然让我的全世界失眠. 孤单患者.不如不见,不要说 ...
随机推荐
- 03 . Prometheus监控容器和HTTP探针应用
Eeporter是什么及来源? 是什么? 广义上讲所有可以向Prometheus提供监控样本数据的程序都可以被称为一个Exporter.而Exporter的一个实例称为target,如下所示,Prom ...
- 什么?你还不会身份证号码验证?最全的身份证正则验证js
话不多说上代码 //身份证号合法性验证 //支持15位和18位身份证号 //支持地址编码.出生日期.校验位验证 function cidInfo(code) { var city={11:" ...
- Android 图片裁剪踩坑
今天做图库图片的裁剪遇到了不少坑,今天记录一下,以下坑位供各位看官参考: 如果有不对之处,欢迎各位看官留言评论! 图片裁剪踩坑锦囊: 问题一:相册裁剪权限问题 解:这个简单,对于Android6. ...
- Controller是什么?
控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现. 控制器负责解析用户的请求并将其转换为一个模型. 在Spring MVC中一个控制器类可以包含多个 ...
- Windows下C,C++开发环境搭建指南
Windows下C,C++开发环境搭建指南 前情提要 基于近一段时间很多网友发邮件反馈,说一些项目编译出现问题,诸如此类的情况. 就觉得很有必要写一篇C,C++开发环境的小指南,统一回复. 1.君欲善 ...
- (八)postman请求的form-data、x-www-form-urlencoded、raw、binary的区别
原文链接:https://blog.csdn.net/jiadajing267/article/details/87883725 1.form-data 等价于http请求中的multipart/fo ...
- (六)获取http状态码和处理返回结果
int StatusCode = httpResponse.getStatusLine().getStatusCode(); 处理返回结果: /** * 处理返回结果 * @param respons ...
- MDK未添加相应芯片的安装包
问题: No Algorithm found for: 00000000H - 00000567HErase skipped!Error: Flash Download failed - " ...
- 【django】CMS开发笔记一:虚拟环境配置
项目代码:https://github.com/pusidun/CMS-django 使用虚拟环境 虚拟环境是Python解释器的虚拟副本.在虚拟环境中安装私有包,不会影响全局的Python解释器.可 ...
- Maven发展历史
1.1 Maven是什么 Maven是一个项目管理和综合工具. Maven提供了开发人员构建一个完整的生命周期框架.开发者团队可以自动完成项目的基础工具建设, Maven使用标准的目录结构和默认构建生 ...