HTTP 的两种请求:GET 和 POST 的作用、区别与本质

1.什么是 HTTP 呢?

超文本传输协议,即 Hyper Text Transfer Protocol ,是一个为了使客户端和服务器顺利进行通讯而设计的 协议

2.HTTP 是如何工作的呢?

HTTP 在客户端与服务器之间以(请求 - 回复协议)工作。请求 - 回复协议主要有 GET 和 POST 两种方法。

3.那这两种方法有什么作用呢?

GET —— 从指定的服务器中获取数据
POST —— 提交数据给指定的服务器处理

4.具体一点

GET 方法
概念:
使用 GET 方法时,查询字符串以键值对的形式被附加在 URL 地址后面,一起发 送到服务器。
比如我们在 优快云 搜索 什么是 GET” ,得到的网址如下:
什么是    GET
从上图我们可以看到, GET 方式将搜索的内容附加在 URL 地址后面,再从指定 的服务器中获取数据显示。其格式为:
分割 URL 和传输数据,参数之间以 & 相连。 数据如果是英文字母 / 数字,原样发 送, 如果是空格,先转换为+ ( 注: + 属于其他字符,需要再次操作 ) 如果是 中文/其他字符,则直接把字符串用 BASE64 加密 ,及 “%” 加上 字符串的 16 进制 ASCII 码
特点:
GET 请求能够被缓存
GET 请求会保存在浏览器的浏览记录中
GET 请求的 URL 能够保存为浏览器书签
GET 请求有长度限制
GET 请求主要用于获取数据。
从上面所述的特点可以发现, 大多数的搜索引擎 的搜索框用的都是 GET 请 求,通过 GET 请求获取搜索到的相关数据。对于倒数第二点 ——GET 请求有长度限制,在你复制一大段文字到搜索框的时候,它只会显示少部分。这就说明了 GET 请求有长度限制。
POST 方法:
概念:
使用 POST 方法时,查询字符串在 POST 信息中单独存在,和 HTTP 请求一起发送到服务器。
特点:
POST 请求不能被缓存下来
POST 请求不会保存在浏览器的浏览记录中
POST 请求的 URL 无法保存为浏览器书签
POST 请求没有长度限制
显然, POST 请求的很多特点与 GET 请求相反,从这个对比我们可以知道, POST 请求比 GET 请求更具有保密性以及安全性。像我们平常的登录网站的账号与密 码的提交就属于 POST 请求。
当然了, HTTP 其实也不止 GET POST 这两种,还有一些其他的请求方法,
如下表:

5.区别(小小总结一下)

GET 在浏览器回退时是无害的,而 POST 会再次提交请求。
GET 产生的 URL 地址可以被添加为书签,而 POST 不可以。
GET 请求会被浏览器主动存储,而 POST 不会,除非手动设置。
GET 请求只能进行 url 编码,而 POST 支持多种编码方式。
GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。
GET 请求在 URL 中传送的参数是有长度限制的,而 POST 没有。
对参数的数据类型, GET 只接受 ASCII 字符,而 POST 没有限制。
GET POST 更不安全,因为参数直接暴露在 URL 上,所以不能用来传递敏感信息。
GET 参数通过 URL 传递, POST 放在 Request body 中。

6. GET POST 的本质

想要面试官眼前一亮,就要从底层出发,再来梳理梳理。
HTTP 是什么?
HTTP 是基于 TCP/IP 的关于数据如何在万维网中通信的协议。
底层是 TCP/IP 。所以 GET POST 的底层也是 TCP/IP ,也就是说, GET/POST 都是 TCP 链接。 GET POST 能做的事情是一样的。你要给 GET 加上 request body(请求体),给 POST 带上 url 参数,技术上是完全行的通的。
再仔细思考 HTTP 的底层是 TCP/IP ,既然 TCP 没有啥不同的地方,那 GET/POST 的差别 会不会是 HTTP 协议搞得鬼?
首先,在咱们万维网世界里, TCP 就是运输工具(如汽车),我们用 TCP 来运 输数据。它很可靠,从来不会发生丢件少件的现象。但是,大家都是 TCP 链接, 也就是说所有的汽车都长一样,路上全是一样的汽车。那么假如有加急的数据需 要传送,若是被不急的数据给挡住路,堵车了怎么办?整个交通系统一定会瘫痪。
那怎么办? 这个时候就需要交通规则来约束行为 HTTP 协议,由此破壳而出。
HTTP 给汽车运输设定了好几个服务类别,有 GET, POST, PUT, DELETE 等等, HTTP 规定,当执行 GET 请求的时候,要给汽车贴上 GET 的标签(设置 method 为 GET ),而且要求把传送的数据放在车顶上( url 中)以方便记录。
如果是 POST 请求,就要在车上贴上 POST 的标签,并把货物放在车厢里。
显然, TCP 才是 GET POST 怎么实现的基本。而 HTTP 只是个行为准则。
由此知道, HTTP 只是对 GET POST 参数的传送渠道( url 还是 requrest body)提出了要求,那刚才关于参数大小的限制又是从哪来的呢? 我们仔细想想,既然万维网里边有那么多运输工具,那不还得有运输公司吗?这 么多种运输工具,岂不是有很多家运输公司?
因此,在我们大万维网世界中,还有另一个重要的角色:运输公司。不同的浏览 器(发起 http 请求)和服务器(接受 http 请求)就是不同的运输公司。 虽然理 论上,你可以在车顶上无限的堆货物(url 中无限加参数)。但是运输公司可不 傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量 太大对浏览器和服务器都是很大负担。
注:业界的规定是,(大多数)浏览器通常都会限制 url 长度在 2K 个字节,而 (大多数)服务器最多处理 64K 大小的 url 。超过的部分,恕不处理。如果你用 GET 服务,在 request body (请求体)偷偷藏了数据,不同服务器的处理方式 也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以, 虽然 GET 可以带 request body ,也不能保证一定能被接收到。
所以, GET POST 本质上就是 TCP 链接,并无差别。但是 由于 HTTP 的规 定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
GET POST 还有一个重大区别,简单的说:
GET 产生一个 TCP 数据包; POST 产生两个 TCP 数据包。
对于 GET 方式的请求,浏览器会把 http header data 一并发送出去,服务器 响应 200 (返回数据);
而对于 POST ,浏览器先发送 header ,服务器响应 100 continue ,浏览器再发 送 data ,服务器响应 200 ok (返回数据)。
在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视, 两种都很快。而在网络环境差的情况下,两次包的 TCP 在验证数据包完整性这 一点上,有非常大的优点。
此外,也并不是所有的浏览器都会在 POST 中发送两次包,像 Firefox 就只发送 一次。
综上,分情况使用 GET POST
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值