本文全面介绍了 HTTP 协议相关知识,包括 HTTP 请求报文、响应报文、持久连接、缓存、Cookie 以及 HTTP 版本升级等!
HTTP 协议全称为 HyperText Transfer Protocol,即超文本传输协议。
超文本
:指文字、图片、音频、视频、文件等的混合体,比如最常见的 HTML。传输
:指数据从一方转移到另一方,二者之间可能相距数千里。协议
:指通信双方所做的一些约定,比如怎么开始通信、信息的格式与顺序、怎么结束通信等。
HTTP 协议是干啥的呢? 答案是用于客户端与服务器端之间的通信。我们日常上网过程中最常见的就是 HTTP 协议了,浏览器是最常见的 HTTP 客户端。
比如我们使用浏览器访问淘宝时,浏览器就会发送一个遵循 HTTP 协议的请求报文到淘宝服务器,告诉淘宝服务器自己想要获取淘宝首页信息。
淘宝服务器收到此报文后,则会发送一个同样遵循 HTTP 协议的响应报文到浏览器,此响应报文中包含淘宝首页的内容。
浏览器收到响应报文后解析内容并展示在界面上。
1. HTTP 请求
客户端向服务器端发送的信息称为请求报文,一般结构如下:
(1)请求行
请求行用于说明要做些什么,包含三部分内容,中间用空格分割。
-
方法,指定要对请求资源做什么样的操作(比如查询、修改等)。常见的方法有:GET、POST、PUT、DELETE、HEAD 等。
在前后端分离开发中,经常会遵循 RESTful 设计风格,其使用 POST、DELETE、PUT、GET 分别表示对数据的增、删、改、查。
-
资源路径,指定所要请求资源在服务器中的位置。比如 /index.html,表示访问服务器根目录下名字为 index 的 html 文件。
-
HTTP 版本,指定所使用的 HTTP 版本。目前使用最多的版本为 HTTP/1.1。
举个栗子:
面试中常见的一个问题: GET 和 POST 的区别是什么?,在这里做一下解答。
-
首先,一般 GET 请求参数存放在 URL 中,而 POST 请求参数存储在请求体中。
因为参数放在 URL 中可以直接被看到,则 GET 请求相对 POST 请求更不安全。但并不是说 POST 请求安全,因为参数放在请求体中,如果不采取加密手段的话,技术人员抓包就能看到明文。
同时各个浏览器对 URL 长度做了限制,比如 IE 浏览器限制 URL 的长度最大为 2KB,这就使得了 GET 请求传输的数据长度有了限制,而 POST 请求传输数据长度无限制。
-
其次,一般 GET 请求用于获取数据,POST 请求用于新增数据。
这里需要提一下幂等性的概念。
幂等性
是指对于同一个系统,在同样条件下,一次请求和重复多次请求对资源的影响是一致的,不会因为多次请求而产生了副作用。GET 请求用于获取资源,不会对系统资源进行改变,因此是幂等的。POST 用于新增资源,这意味着多次请求将创建多个资源,因此不是幂等的。
基于这个特点,GET 请求可被缓存、可保留在浏览器历史记录中、浏览器回退不会产生副作用,而 POST 请求反之。
-
最后,GET 和 POST 在本质上并无区别。
HTTP 的底层是 TCP,所以无论是 GET 还是 POST 底层都是通过 TCP 进行连接通信。
我们可以给 GET 加请求体,给 POST 带上 URL 参数,可以用 GET 请求新增数据,POST 请求查询数据,实际上也是完全可行的。
(2)请求头
请求头用于向服务器传递一些额外的重要信息,比如所能接收的语言等。
请求头由字段名和字段值构成,二者之间用冒号进行分隔。常见的一些请求头有:
请求头 | 含义 |
---|---|
Host | 接收请求的域名 |
User-Agent | 客户端软件的名称和版本号等相关信息 |
Connection | 设置发送响应之后 TCP 连接是否继续保持的通信选项 |
Cache-Control | 控制缓存的相关信息 |
Referer | 记录请求的来源(当通过点击超级链接进入下一个页面时,会记录上一个页面的 URI) |
Accept | 客户端可支持的数据类型, 以 MIME 类型来表示 |
Accept-Encoding | 客户端可支持的编码格式 |
Accept-Language | 客户端可支持的语言 |
If-Modified-Since | 用于判断资源的缓存是否有效(客户端通知服务器,本地缓存的最后变更时间) |
If-None-Match | 用于判断资源的缓存是否有效 |
Range | 用于断点续传,指定第一个字节的位置和最后一个字节的位置。 |
Cookie | 表示请求者的身份,用于保存状态信息 |
(3)请求空行
请求空行用于表明请求头已经结束。
(4)请求体
请求体用于传送客户端要发给服务器的数据,比如请求参数,通常出现在 POST 请求方法中,而 GET 方法无请求体,它的请求参数直接会显示在网址上面。
请求行和请求头的数据都是文本形式且格式化的,而请求体不同,其可以包含任意的二进制数据,比如文本、图片、视频等等。
2. HTTP 响应
服务器向客户端发送的信息称为响应报文,响应报文的结构一般如下:
(1)响应行
响应行用于说明对请求的处理情况,包含三部分内容,中间用空格分割。
-
HTTP 版本,指定所使用的 HTTP 版本。比如 HTTP/1.1 表示使用的 HTTP 版本是 1.1。
-
状态码,以三位数字形式描述服务器对请求的处理结果。比如 200 表示成功。
-
消息短语,以文本形式描述服务器对请求的处理结果。比如 OK 表示成功。
举个栗子:
面试中常见的一个问题: HTTP 有哪些常见状态码?,在这里做一下解答。
-
200 OK
:表示请求被正常处理,这是最常见的状态码。 -
204 No Content
:表示请求被正常处理,但在返回的响应报文中不含响应体内容。一般用在只是客户端向服务器发送信息,而服务器不用向客户端返回什么信息的情况。不会刷新页面。 -
301 Moved Permanently
:永久重定向,表示请求的资源已经被永久转移了,新的 URL 定义在响应报文的 Location 字段中,浏览器将自动获取新的 URL 发出新的请求。对搜索引擎来说,如果是 301 永久性重定向,页面会删除失效的 URL 收录、索引,并替换为新的 URL。两个不同的 URL 有指向相同的内容,搜索引擎对这两个 URL 收录的情况不同,会导致 URL 的权重和排名被分散。做了重定向后,可以将权重和排名集中到重定向后的 URL,因此可以提升自然排名。
场景:比如建设一个网站后,将网站的 url 变换了,重新申请一个域名,但是希望之前 url 仍然可以访问到,就可以做一个重定向到新的 url 下面。比如京东最早网址 http://www.360buy.com 重定向到 http://www.jd.com。
-
302 Found
:临时重定向(即以后还可能有变化),表示请求的资源已被临时分配了新的 URL,新的 URL 会在响应报文中的 Location 字段中返回,浏览器将会自动使用新的 URL 发出新的请求。搜索引擎会保留原 URL 的收录和索引,并新增新 URL 的收录、索引,这样更有利于页面的程序化处理。
比如用户在未登录时访问个人中心页面,这时可以临时重定向到登录的 url;
或者协议发生变化,比如京东 http://www.jd.com 重定向到 https://www.jd.com;
再比如,今天夜里网站后台要系统维护,服务暂时不可用,这就属于『临时』的,可以配置成 302 跳转,把流量临时切换到一个静态通知页面