1. 前言

无论是作为后端开发、前端开发、测试开发程序员或者是运维人员,在面试过程中,大概率都会被问到 HTTP 协议相关题目。

因为伴随着 2010 年之后移动互联网在全世界的高速发展,各种各样的浏览器(Chrome、FireFox、Safari 等)层出不穷,也诞生了诸多服务端开发的语言(例如 Golang 语言),浏览器和服务端之间的交互是不可避免的,我们对于不同的浏览器和不同的服务端,总不能每次都创建一种新的交互协议,所以需要确定统一的协议规范,也就是本文的 HTTP 协议。

2.1 HTTP 协议定义

面试官提问: 什么是 HTTP 报文?什么是 HTTP 报文?

题目解析: 首先,我们给出 HTTP 的定义:HTTP(HyperText Transfer Protocol,超文本传输协议)是一个请求 - 响应(Request to Response)协议,位于网络模型的应用层,基于传输层的 TCP 协议。

图片描述

(HTTP 请求 - 响应模型)

其次,HTTP 报文是在客户端和服务器端传输的数据报文,由起始行(Start Line)、请求头部(Request Header)和请求主体(Request Body)构成,从类型上分为请求报文(Request Message)和响应报文(Response Message)。

图片描述

(HTTP 报文格式)

2.2 HTTP 请求方法

面试官提问: HTTP 协议的请求方法有哪些,有啥区别?

题目解析:

序号 方法 说明
1 GET 请求服务器上的资源,请求体不会包含请求数据,参数可以通过 URL 传输。
2 POST 用户传输信息到服务器,请求方式类似 GET 请求,比如提交表单。
3 PUT 用户传输信息到服务器,请求方式类似 POST 请求,比如提交文件。
4 DELETE 请求服务器删除某个资源,和 POST 请求作用相反。
5 OPTIONS 查询 URL 支持的 HTTP 方法。
6 HEAD 请求方式类似 GET 请求,但是服务器不会返回消息体,一般用于检查网页是否被修改、检查 URL 是否有效。

除此之外,HTTP 协议还有 TRACE、CONNECT 等方法,但是在日常开发中基本不会用到,所以不用关注。

面试官常常会将 POST 和 GET 方法进行对比,我们需要注意以下几个不同:

(1)GET 请求主要是为了从服务器获取资源,POST 请求主要是为了向服务器发送资源。

(2)GET 请求是通过 URL 传参,形式是 field = value,多个参数使用 & 进行分割,例如 http://127.0.0.1/login?username=xiaoming&password=123456。POST 请求是通过请求体传参,即信息存放到 Request Body 中。

(3)GET 请求传输的信息量少,POST 请求能够传输的信息量多。

(4)GET 请求参数在 URL 明文,容易被爬虫直接获取,POST 请求参数不直接可见,安全性更高,例如在表单提交密码时,必须使用 POST 请求。

2.3 HTTP 状态码

面试官提问: 请枚举一些常见的 HTTP 状态码,并且说明作用。

题目解析:

首先我们从性质上分类,HTTP 的响应状态码总共有 1XX 到 5XX 五种类型,关于每种状态码的定义:

状态码开头 性质
1XX 服务器收到请求,需要请求者继续执行操作。
2XX 客户端请求成功,并且服务端成功处理。
3XX 重定向,需要进一步的操作以完成请求。
4XX 客户端错误,请求包含语法错误或者无法完成请求。
5XX 服务器错误,服务器在处理请求的过程中发生了错误。

对于 4XX 开头的错误码,都是因为客户端自身的原因产生,例如我们输入 URL:http://www.imooc.com/home,因为不存在这个 URL 对应的资源,所以返回 404 Not Found,找不到页面。

对于 5XX 开头的错误码,都是因为服务器处理过程中遇到异常产生,例如后端开发程序员在处理 HTTP 请求的过程触发了 Exception,导致响应失败。

在定性之后,面试官大概率还要抽出几个常见的状态码,考察其具体的含义,我们对常见的状态码也需要进行总结:

状态码 状态码对应英文 说明
100 Continue 服务器收到了客户端的请求行和头部信息,告诉
客户端继续发送数据部分。
200 OK 请求成功。
301 Permanently Moved 资源被永久转移了,请求将被重定向。
302 Temporarily Moved 资源被临时转移了,请求将被重定向。
404 Not Found 资源没找到。
500 Internal Server Error 服务器内部错误。

这里需要分区开 301 和 302 错误码(也是常见考点),从字面意思上看,301 和 302 都代表某个 URL 被转移了,区别在于:

(1)301 表示资源被永久转移了,搜索引擎(例如百度的爬虫)在爬取网站的时候会抓取新网站的内容并且保留新网站的 URL。

(2)302 表示资源被临时转移了,也就是临时重定向,搜索引擎在爬取网站的时候会抓取新的内容,但是保留旧网站作为 URL。

3. 小结

HTTP 协议应该是前端、后端、测试开发人员最常接触的网络协议了,因为这是网站和用户之间传输信息的直接渠道。面试官考察 HTTP 相关的问题,也是为了了解候选人的开发基本功,为了熟悉本小结的知识,大家也可以了解下发送 HTTP 的 Postman 开发工具,以及 HTTP 网络抓包的 Wireshark 工具。