1. 前言
无论是作为后端开发、前端开发、测试开发程序员或者是运维人员,在面试过程中,大概率都会被问到 HTTP 协议相关题目。
因为伴随着 2010 年之后移动互联网在全世界的高速发展,各种各样的浏览器(Chrome、FireFox、Safari 等)层出不穷,也诞生了诸多服务端开发的语言(例如 Golang 语言),浏览器和服务端之间的交互是不可避免的,我们对于不同的浏览器和不同的服务端,总不能每次都创建一种新的交互协议,所以需要确定统一的协议规范,也就是本文的 HTTP 协议。
2.1 HTTP 协议定义
面试官提问: 什么是 HTTP 报文?什么是 HTTP 报文?
题目解析: 首先,我们给出 HTTP 的定义:HTTP(HyperText Transfer Protocol,超文本传输协议)是一个请求 - 响应(Request to Response)协议,位于网络模型的应用层,基于传输层的 TCP 协议。
其次,HTTP 报文是在客户端和服务器端传输的数据报文,由起始行(Start Line)、请求头部(Request Header)和请求主体(Request Body)构成,从类型上分为请求报文(Request Message)和响应报文(Response Message)。
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 工具。