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.xianlaiwan.cn/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 工具。