1.什么是 HTTP 呢?
超文本传输协议,即
Hyper Text Transfer Protocol
,是一个为了使客户端和服务器顺利进行通讯而设计的
协议。
2.HTTP 是如何工作的呢?
HTTP
在客户端与服务器之间以(请求
-
回复协议)工作。请求
-
回复协议主要有 GET 和
POST
两种方法。
3.那这两种方法有什么作用呢?
GET ——
从指定的服务器中获取数据
POST ——
提交数据给指定的服务器处理
4.具体一点
GET
方法
概念:
使用
GET
方法时,查询字符串以键值对的形式被附加在
URL
地址后面,一起发 送到服务器。
比如我们在
优快云
搜索
“
什么是
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