你真的了解 get 和 post 的区别么

get 和 post 是两种最常用的 HTTP 请求方法,要说它们两个的区别,相必接触过 WEB 开发的人都能够说出一二。

如果我问你这个问题,你的内心充满了自信和喜悦。你已经写过无数个 GET 和 POST 请求,也看过很多权威网站总结出的他们的区别,你非常清楚知道什么时候该用什么。

于是你在心里默念...

从本质上来说,get 是向服务器请求数据,而 post 是向服务器提交要被处理的数据。

最直观的区别是 get 的请求参数是在 url 中发送的,而 post 的请求参数是在 HTTP 消息主体中发送的。

然后你轻轻松松、潇潇洒洒的给出了一个“标准答案”:

  • get 在回退和刷新时是无害的,post 的数据会被重新提交。
  • get 的参数可以被书签和历史记录保存,post 的参数不能被书签和历史记录保存。
  • get 只支持 url 分割(application/x-www-form-urlencoded)的格式,post 支持多种编码格式,如:url 分割、FormData、text/plain、json 等。
  • get 在 url 中添加的参数有长度限制,post 的参数长度没有限制。
  • get 只允许 ASCII 字符的数据类型,post 没有数据类型的限制。
  • get 相对 post 来说安全性较差,因为 get 的参数直接在 url 中对所有人可见。因此不要在发送密码或其他敏感信息时使用 get 方法。

以上标准答案来自于:w3school

很遗憾,这并不是我期待的答案!如果我告诉你 get 和 post 本质上没有区别 ,你信么?

要想说清楚这个问题,我们就要回到一切开始的地方。

get 和 post 是什么?get 和 post 是两种最常用的 HTTP 请求方法。

那么 HTTP 又是什么?HTTP 是基于 TCP/IP 进行客户端和服务器之间通信的超文本传输协议。

HTTP 的底层是 TCP/IP 。所以 GET 和 POST 的底层也是 TCP/IP ,也就是说,GET/POST 都是 TCP 链接。GET 和 POST 能做的事情是一样一样的。你把 GET 参数加到 HTTP 消息主体中,或者给 POST 带上 url 参数,技术上是完全行的通的。

看到这里你又会问了,既然没有区别,那么上面的“标准答案”又是怎么回事?

注意,并没有人说“标准答案”有误。只是上边的区别是依赖于浏览器/服务器而存在的。

数据传输就相当于货物运输,装货和卸货就相当于数据的发送和接收。如果运输公司(浏览器和服务器)不对货物运输进行规范,任由他们无限的堆积货物、随意的隐秘货品。那么势必会对运输公司造成负担,产生很大额外的经济成本。所以他们就形成了业内规范(HTTP 协议),不同的货物用不同的装载方式(不同的请求方法),装载货物的多少也进行了限制(浏览器一般限制 url 长度在 2K 内,服务器最多处理 64K 大小的 url)。

所以看到这里你应该明白了吧。GET和POST本质上都是TCP链接,并无差别。但是由于 HTTP 的规定和浏览器/服务器的限制,导致他们在浏览器的实际应用过程中体现出一些不同。

看到这里也就结束了。现在,当面试官或者或者你的同事再问你 get 和 post 的区别,你终于可以安安稳稳的装 13 了。

猜你喜欢

转载自www.cnblogs.com/wangdapang/p/10481123.html