【前端 · 面试 】HTTP 总结(五)—— GET 和 POST

最近我在做前端面试题总结系列,感兴趣的朋友可以添加关注,欢迎指正、交流。

争取每个知识点能够多总结一些,至少要做到在面试时,针对每个知识点都可以侃起来,不至于哑火。

GET 和 POST

前言

在前后端交互的过程中,使用频率最高的莫过于 GET 和 POST 这两个方法,并且这也是面试中被问到频率很高的知识点。

面试常常会问:GET 和 POST 方法的区别是什么?

这个问题常常会导致我们只关心了它们两个之间的一些差异,而忽略了它们之间的共性,所以对于问题的回答就略显浅显。

今天我们就来深扒一下两个方法到底有何异同。

相同点

如果我要说, GET 和 POST 的本质是相同的,不知道有多少人会有异议?

GET 和 POST 方法只是 HTTP 协议为了不同分工而规定的两种请求方式。

HTTP 是什么?HTTP 是基于 TCP/IP 的关于数据如何在万维网中如何通信的协议。

HTTP 的底层是 TCP/IP。所以 GET 和 POST 的底层也是 TCP/IP,也就是说,GET 和 POST 都是 TCP 链接。所以说,它们的本质是相同的。

GET 和 POST 之所以产生,要通过HTTP的规则和浏览器/服务器的限制进行区分,使它们在应用过程中体现出不同。

整个请求过程大概是这样的:

  • 客户端 IP 发出请求。
  • 发出的请求数据包会通过 TCP ,经网络传输给远程服务端 IP。
  • 服务端 IP 收到请求包之后,解析并处理请求包最后服务端会通过 TCP 将处理结果返回给客户端。
  • 用户便可以查看到想要的响应数据。

区别

虽然说 GET 和 POST 请求的本质是相同的 —— 都是 TCP 连接,但是,在平时的使用中还是存在一定区别的。

我们这里所说的区别其实都是约定俗成的一些东西,有些区别的界限可能不是很明确。

作用不同

既然是为了不同分工而产生的两种方法,那么它们作用肯定是不同的:

  • GET 多用于从服务端获取资源
  • POST 一般用来向服务端提交资源

其实这是一句废话,之所以列出来,是为了内容更全面一些。

参数传递方式不同

这一点应该是我们能够最直观地观察到的。

  • GET 的参数一般是通过 ? 跟在 URL 后面的,多个参数通过 & 连接,比如:www.example.com?serach=bianchengsanmei&content=123
  • POST 的参数一般是包含在 request body 中的image-20210805202707330

其实,这个区别不是绝对的,GET 也可以通过 params 携带参数,而 POST 的URL 后面也可以携带参数,只是我们通常不建议这么做而已。

安全性不同

因为参数传递方式的不同,所以 GET 和 POST 的安全性不同:GET 比 POST 更不安全,因为参数直接暴露在URL上,所以 GET 不能用来传递敏感信息。

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

参数长度限制不同

GET 和 POST 传递参数的长度不同:

  • get传送的数据量较小,不能大于2KB。
  • post传送的数据量较大,一般被默认为不受限制。

在这里我们要明确一点:HTTP 协议没有 Body 和 URL 的长度限制,对 URL 限制的大多是浏览器和服务器的原因。

服务器是因为处理长 URL 要消耗比较多的资源,为了性能和安全(防止恶意构造长 URL 来攻击)考虑,会给 URL 长度加限制。

参数数据类型不同

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

编码方式不同

GET 请求只能进行 URL 编码(application/x-www-form-urlencoded)

POST 支持多种编码方式(application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。)

缓存机制不同

这个需要从以下几点来说明:

  • GET 请求会被浏览器主动cache,而 POST 不会,除非手动设置。
  • GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。
  • GET 产生的 URL 地址可以被 Bookmark,而 POST 不可以。
  • GET 在浏览器回退时是无害的,而 POST 会再次提交请求。

时间消耗不同

GET 和 POST 请求时间的不同主要是因为:

  • GET 产生一个 TCP 数据包;
  • POST 产生两个 TCP 数据包。

对于 GET 方式的请求,浏览器会把 header 和 data 一并发送出去,服务器响应 200(返回数据);而对于 POST,浏览器先发送 Header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据),详细分析一下:

POST 请求的过程:

  1. 浏览器请求 TCP 连接(第一次握手)

  2. 服务器答应进行 TCP 连接(第二次握手)

  3. 浏览器确认,并发送 POST 请求头(第三次握手,这个报文比较小,所以 HTTP 会在此时进行第一次数据发送)

  4. 服务器返回100 Continue响应

  5. 浏览器发送数据

  6. 服务器返回 200 OK响应

GET 请求的过程:

  1. 浏览器请求 TCP 连接(第一次握手)
  2. 服务器答应进行 TCP 连接(第二次握手)
  3. 浏览器确认,并发送 GET 请求头和数据(第三次握手,这个报文比较小,所以 HTTP 会在此时进行第一次数据发送)
  4. 服务器返回 200 OK响应

在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。

总结

GET 和 POST 的异同点就总结了这么多,由于时间仓促,疏漏之处在所难免,欢迎指正,本文会持续改进!

~

~本文完,感谢阅读!

~

学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!

大家好,我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!

你来,怀揣期望,我有墨香相迎! 你归,无论得失,唯以余韵相赠!

知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!

参考资料:

[1] GET和POST两种基本请求方法的区别

[2] 面试必备:GET和POST的区别详细解说

[3] POST与GET的区别

全部评论

相关推荐

07-24 19:01
门头沟学院 Java
后天笔试,又要开始做题了
Sairus:明天10:00笔试
投递京东等公司10个岗位
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务