写点什么

听我讲完 GET、POST 原理,面试官给我倒了杯卡布奇诺

  • 2021 年 11 月 11 日
  • 本文字数:2381 字

    阅读完需:约 8 分钟


以下是熊猫和面试官刘经理的对话。


面试官:小李啊,你们常用的 HTTP 请求方法都有哪些啊?


熊猫:是这样的,HTTP/1.1 协议中共定义了八种方法,有时也叫“动作”,来表明 Request-URL 指定的资源不同的操作方式


  • 在 HTTP1.0 中,定义了三种请求方法: GET, POST 和 HEAD 方法。

  • 在 HTTP1.1 中,新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法


但我们常用的一般就是 GET 和 POST 请求。


面试官:嗯,那你说说 GET 和 POST 请求都有哪些区别呢?(果然进套了,看你小子有几斤几两)



熊猫:(其实这就是三十六计第十七计抛砖引玉。我昨晚专门看了陈哈哈的博客,问到上面问题就给面试官放个钩儿,果然上钩了。。好,先给他来波官方标准答案,看他怎么说


熊猫:这个。。。没有太关注过,以我的理解,大概有这么几种区别吧:


  1. GET 请求在 URL 中传送的参数是有长度限制的,而 POST 没有。


  1. GET 比 POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息。而 POST 数据不会显示在 URL 中。是放在 Request body 中。


  1. 对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制。


  1. GET 请求参数会被完整保留在浏览器历史记录里;相反,POST 请求参数也不会被浏览器保留。


  1. GET 请求只能进行 url 编码(application/x-www-form-urlencoded),而 POST 支持多种编码方式。


  1. GET 请求会被浏览器主动缓存,而 POST 不会,除非手动设置。


  1. GET 在浏览器回退时是无害的,而 POST 会再次提交请求。


面试官:(没关注过,那你还背的一条不差。跟我搁这儿装 B 呢?看我怎么教育你。)



面试官: 那 Get 请求有 Request body 么?如果有的话参数可以像 Post 请求一样放在里面么?


熊猫:(吼吼,看来有机会把我昨天精心准备的东西给他扯半小时了[手动挠头]? 让开,我要装波 B 了)



**熊猫:**其实吧,GET 和 POST 在本质上没有区别,都是 HTTP 协议中的两种发送请求的方法。而 HTTP 呢,是基于 TCP/IP 的关于数据如何在万维网中如何通信的协议。?


万维网:简称 WWW,是 World Wide Web 的简称,也称为 Web、3W 等


HTTP 的底层是 TCP/IP。所以 GET 和 POST 的底层也是 TCP/IP,也就是说,GET/POST 都是 TCP 链接。


GET 和 POST 能做的事情是一样一样的。你要给 GET 加上 request body,给 POST 带上 url 参数,技术上是完全行的通的。?


举个例子吧:


TCP 就像汽车,我们用 TCP 来运输数据,它很可靠,从来不会发生丢件少件的现象。


但是如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,送急件的汽车可能被前面满载货物的汽车拦堵在路上,整个交通系统一定会瘫痪。



为了避免这种情况发生,交通规则 HTTP 诞生了。HTTP 给汽车运输设定了好几个服务类别,包括 GET, POST, PUT 等等,


HTTP 规定,当执行 GET 请求的时候,要给汽车贴上 GET 的标签(设置 method 为 GET),而且要求把传送的数据放在车顶上(url 中)以方便记录。


如果是 POST 请求,就要在车上贴上 POST 的标签,并把货物放在车厢里(request body 中)。


当然,你也可以在用 GET 的时往车厢内偷偷藏点货物,但这并不不光彩;也可以在 POST 的时候在车顶上也放一些数据,也会让人觉得傻乎乎的。



HTTP 只是个行为准则,而 GET 和 POST 本质上就是 TCP 链接,并无差别。但是由于 HTTP 的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。


面试官:(哎呀,这小子还真的了解这块儿啊,看来是我误会他了,难道遇到了大佬?)



**面试官:**小李,你说的不错,那你刚才说的 URL 中传送参数的长度限制在 Get 和 Post 中都是怎么样的呢?


**熊猫:**其实在 Web 中啊,还有另一个重要的角色:运输公司。


不同的浏览器 Client 端(发起 http 请求)和服务器 server 端(接受 http 请求)就是不同的运输公司。


虽然理论上,你可以在车顶上无限的堆货物(url 中无限加参数)。但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。


业界不成文的规定是,(大多数)浏览器通常都会限制 url 长度在 2K 个字节,而(大多数)服务器最多处理 64K 大小的 url。


**超过的部分,恕不处理。**如果你用 GET 服务,在 request body 偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略。


所以,虽然 GET 可以带 request body,却不能保证一定能被接收到。



示例:


我之前处理过一个 bug,用户反应查询没有响应,同事查了日志后才发现有几个参数都是 undefined,很奇怪,最后发现原来是因为 Get 请求第一个查询参数太长了,导致 URL 后面的部分服务器无法接收 ,后来把请求改成 post,将参数放在 request body 后就可以了。?


面试官:(看来理论确实是掌握的不错,让我考考他实际应用)


**面试官:**那 GET 方法参数写法是固定的吗?


**熊猫:**在约定中,我们的参数是写在 ? 后面,用 & 分割。如下:


http://ip:port/project/getUserInfo?username=chenhhaha&age=26&sex=2


我们知道,解析报文的过程是通过获取 TCP 数据,用正则等工具从数据中获取 Header 和 Body,从而提取参数。


比如 header 请求头中添加 token,来验证用户是否登录等权限问题。


也就是说,我们可以自己约定参数的写法,只要服务端能够解释出来就行,万变不离其宗。


**面试官:**那么说来,是不是 POST 方法比 GET 方法更安全呢?


**熊猫:**有人说 POST 比 GET 安全,因为数据在地址栏上不可见。


然而,从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输的,只要在网络节点上捉包,就能完整地获取数据报文。


其实,要想安全传输,就只有加密,也就是 HTTPS。



**面试官:**嗯,不错小李,看来你对 HTTP 协议这块儿还是有一定了解的,那么你知道 Get、Post 请求发送的数据包有什么不同吗?


熊猫:(看来这面试官是非要是把我问倒才满意啊?可惜可惜。看我套路他一波)


![](https://img-blog.csdnimg.cn/img


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


_convert/815e99e512b91ddd86cf9cb6e24c2cc8.png)

评论

发布
暂无评论
听我讲完GET、POST原理,面试官给我倒了杯卡布奇诺