这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战html
最近我在作前端面试题总结系列,感兴趣的朋友能够添加关注,欢迎指正、交流。前端
争取每一个知识点可以多总结一些,至少要作到在面试时,针对每一个知识点均可以侃起来,不至于哑火。git
在先后端交互的过程当中,使用频率最高的莫过于 GET 和 POST 这两个方法,而且这也是面试中被问到频率很高的知识点。web
面试经常会问:GET 和 POST 方法的区别是什么?面试
这个问题经常会致使咱们只关心了它们两个之间的一些差别,而忽略了它们之间的共性,因此对于问题的回答就略显浅显。编程
今天咱们就来深扒一下两个方法到底有何异同。后端
若是我要说, GET 和 POST 的本质是相同的,不知道有多少人会有异议?浏览器
GET 和 POST 方法只是 HTTP 协议为了避免同分工而规定的两种请求方式。缓存
HTTP 是什么?HTTP 是基于 TCP/IP 的关于数据如何在万维网中如何通讯的协议。安全
HTTP 的底层是 TCP/IP。因此 GET 和 POST 的底层也是 TCP/IP,也就是说,GET 和 POST 都是 TCP 连接。因此说,它们的本质是相同的。
GET 和 POST 之因此产生,要经过HTTP的规则和浏览器/服务器的限制进行区分,使它们在应用过程当中体现出不一样。
整个请求过程大概是这样的:
虽说 GET 和 POST 请求的本质是相同的 —— 都是 TCP 链接,可是,在平时的使用中仍是存在必定区别的。
咱们这里所说的区别其实都是约定俗成的一些东西,有些区别的界限可能不是很明确。
既然是为了避免同分工而产生的两种方法,那么它们做用确定是不一样的:
其实这是一句废话,之因此列出来,是为了内容更全面一些。
这一点应该是咱们可以最直观地观察到的。
?
跟在 URL 后面的,多个参数经过 &
链接,好比:www.example.com?serach=bianchengsanmei&content=123
。request body
中的其实,这个区别不是绝对的,GET 也能够经过 params 携带参数,而 POST 的URL 后面也能够携带参数,只是咱们一般不建议这么作而已。
由于参数传递方式的不一样,因此 GET 和 POST 的安全性不一样:GET 比 POST 更不安全,由于参数直接暴露在URL上,因此 GET 不能用来传递敏感信息。
从传输的角度来讲,他们都是不安全的,由于 HTTP 在网络上是明文传输的,只要在网络节点上捉包,就能完整地获取数据报文,要想安全传输,就只有加密,也就是 HTTPS。
GET 和 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 和 POST 请求时间的不一样主要是由于:
对于 GET 方式的请求,浏览器会把 header 和 data 一并发送出去,服务器响应 200(返回数据);而对于 POST,浏览器先发送 Header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据),详细分析一下:
浏览器请求 TCP 链接(第一次握手)
服务器答应进行 TCP 链接(第二次握手)
浏览器确认,并发送 POST 请求头(第三次握手,这个报文比较小,因此 HTTP 会在此时进行第一次数据发送)
服务器返回100 Continue响应
浏览器发送数据
服务器返回 200 OK响应
在网络环境好的状况下,发一次包的时间和发两次包的时间差异基本能够无视。而在网络环境差的状况下,两次包的TCP在验证数据包完整性上,有很是大的优势。
GET 和 POST 的异同点就总结了这么多,因为时间仓促,疏漏之处在所不免,欢迎指正,本文会持续改进!
~
~本文完,感谢阅读!
~
学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!
你们好,我是〖编程三昧〗的做者 隐逸王,个人公众号是『编程三昧』,欢迎关注,但愿你们多多指教!
你来,怀揣指望,我有墨香相迎! 你归,不管得失,惟以余韵相赠!
知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!
参考资料:
[3] POST与GET的区别