無論你是Java、PHP開發者,還是運維人員,只要從事互聯網行業,面試時都可能被問到HTTP協議相關知識。歷時多天的嘔心瀝血,為你總結了HTTP協議的經典面試題。由於涉及內容比較繁雜不方便記憶,建議收藏起來,時不時看一遍或者面試前突擊復習。
什么是HTTP報文?
HTTP報文是HTTP協議在客戶端和服務端之間傳送的數據塊。
HTTP報文由哪三部分組成?
HTTP報文由起始行(start line)、頭部(header)和主體(body)三部分組成,起始行是對報文進行的描述,頭部包含報文的一些屬性,主體包含報文的數據(可選,非必選)。
歡迎關注微信公眾號:萬貓學社,每周一分享Java技術干貨。
HTTP報文分為哪兩類?
HTTP報文可以分為:請求報文(request message)和響應報文(response message)。當客戶端向服務端發送請求時,就是發送請求報文;當服務端向客戶端返回數據時,就是返回響應報文。比如,獲取一個文本需要的請求報文和響應報文:

HTTP常見的請求方法有哪些?
| 方法 | 描述 | 是否包含主體 |
|---|---|---|
| GET | 從服務端獲取指定信息 | 否 |
| POST | 向服務端發送待處理的數據 | 是 |
| HEAD | 從服務端獲取指定信息的頭部 | 否 |
| PUT | 向服務端發送數據並替換服務端上指定的數據 | 是 |
| OPTIONS | 查詢針對請求URL指定的資源支持 | 否 |
| DELETE | 從服務端刪除指定數據 | 否 |
| TRACE | 沿着目標資源的路徑執行消息環回測試 | 否 |
HTTP的狀態碼分為哪幾類?
| 整體范圍 | 已定義范圍 | 分類 |
|---|---|---|
| 100~199 | 100~101 | 信息提示 |
| 200~299 | 100~206 | 成功 |
| 300~399 | 300~305 | 重定向 |
| 400~499 | 400~415 | 客戶端錯誤 |
| 500~599 | 500~505 | 服務端錯誤 |
歡迎關注微信公眾號:萬貓學社,每周一分享Java技術干貨。
HTTP常見的狀態碼有哪些?
| 狀態碼 | 原因短語 | 含義 |
|---|---|---|
| 100 | Continue | 說明收到了請求的初始部分,請客戶端繼續。 |
| 101 | Switching Protocols | 說明服務端正在根據客戶端的指定,將協議切換成Update頭部所列的協議。 |
| 200 | OK | 請求沒有問題,主體包含了所請求的數據。 |
| 201 | Created | 用於在服務端創建數據的請求(比如PUT),Location頭部給出了創建數據的URL。 |
| 202 | Accepted | 請求已經被接受,但服務端還沒有對其執行任何動作。 |
| 203 | Non-Authoritative Information | 數據已經正常地返回,但一些響應報文頭部可能不正確。 |
| 204 | No Content | 響應報文中包含起始行和頭部,沒有主體部位。客戶端應該繼續顯示原來的數據。 |
| 205 | Reset Content | 仍然沒有主體部分,但客戶端應該清除它所顯示的數據。 |
| 206 | Partial Content | 成功執行了一部分或者一個范圍內的請求。 |
| 300 | Multiple Choices | 客戶端請求了一個實際指向多個資源的URL,服務端可以在Location頭部包含首選URL。 |
| 301 | Moved Permanently | 請求的URL已經被移除,響應報文中的Location頭部包含現在資源的URL。 |
| 302 | Found | 類似於301,但新的URL應該被視為臨時性的,將來的請求仍應是老的URL。 |
| 303 | See Other | 類似於301,但主要目的是允許POST請求的響應將客戶端定向到某個資源上。 |
| 304 | Not Modified | 客戶端有緩沖的文檔並發出了一個條件性的請求時,服務端告知客戶端,原來緩沖的數據還可以繼續使用。 |
| 305 | Use Proxy | 用來說明必須通過代理進行訪問,代理的位置在Location頭部給出。 |
| 306 | - | 未使用 |
| 307 | Temporary Redirect | 類似於301,但客戶端應該使用Location頭部給出的URL臨時請求,將來的請求仍應是老的URL。 |
| 400 | Bad Request | 客戶端發出的是錯誤請求,服務器無法理解。 |
| 401 | Unauthorized | 請求要求客戶端的身份認證 |
| 402 | Payment Required | 保留,以作將來使用 |
| 403 | Forbidden | 服務端理解客戶端的請求,但是拒絕執行此請求。 |
| 404 | Not Found | 服務端無法找到客戶端所請求的URL。 |
| 405 | Method Not Allowed | 服務端不支持客戶端請求的方法。 |
| 406 | Not Acceptable | 服務端無法根據客戶端請求的類型完成請求。 |
| 407 | Proxy Authentication Required | 類似於401,但用於要求對資源進行認證的代理服務器。 |
| 408 | Request Timeout | 服務端等待客戶端發送的請求時間過長,服務端可以響應此狀態碼,並關閉連接。 |
| 409 | Conflict | 客戶端的請求可以在資源上引發一些沖突,服務端可以發送此狀態碼。 |
| 410 | Gone | 類似於404,但是服務端曾經擁有過此資源。 |
| 411 | Length Required | 服務端要求客戶端的請求報文中包含Content-Length頭部時,使用此狀態碼。 |
| 412 | Precondition Failed | 客戶端發起了條件請求,並且其中一個條件失敗時,使用此狀態碼。 |
| 413 | Request Entity Too Large | 客戶端發送的主體部分比服務端能夠或者期望處理的要大時,使用此狀態碼。 |
| 414 | Request URI Too Large | 客戶端發送的請求URI比服務端能夠或者期望處理的要長時,使用此狀態碼。 |
| 415 | Unsupported Media Type | 服務端無法理解或無法支持客戶端所發的內容類型是,使用此狀態碼。 |
| 416 | Requested Range Not Satisfiable | 客戶端請求指定資源的范圍無效或無法滿足。 |
| 417 | Expectation Failed | 服務端無法滿足客戶端的Expect頭部。 |
| 500 | Internal Server Error | 服務端發生內部錯誤,無法完成請求。 |
| 501 | Not Implemented | 服務端不支持客戶端的請求,無法完成請求。 |
| 502 | Bad Gateway | 作為網關或代理的服務器,從遠端服務端接收到了一個無效的請求。 |
| 503 | Service Unavailable | 用來說明服務端現在無法為請求提供服務,但是將來可以。什么時候資源會變為可用可包含在服務端的Retry-After頭部中。 |
| 504 | Gateway Timeout | 類似於408,只是作為網關或代理的服務器,未及時從遠端服務端獲取請求。 |
| 505 | HTTP Version Not Supported | 服務端不支持請求的HTTP協議的版本,無法完成處理。 |
歡迎關注微信公眾號:萬貓學社,每周一分享Java技術干貨。
HTTP常見的頭部信息有哪些?
請求報文的頭部信息
| Header | 含義 | 示例 |
|---|---|---|
| Accept | 指定客戶端能夠接收的內容類型。 | Accept: text/html,application/xhtml+xml |
| Accept-Charset | 客戶端可以接受的字符編碼集。 | Accept-Charset: GBK |
| Accept-Encoding | 客戶端可以支持的服務端返回內容壓縮編碼類型。 | Accept-Encoding: gzip, deflate |
| Accept-Language | 客戶端可接受的語言 | Accept-Language: zh-CN,zh |
| Authorization | HTTP授權的授權證書 | Authorization: Basic b25lbW9yZSUzQSV1NEUwNyV1NzMyQiV1NUI2NiV1NzkzRQ== |
| Cache-Control | 指定請求和響應遵循的緩存機制 | Cache-Control: no-cache |
| Connection | 表示是否需要持久連接。 | Connection: keep-alive |
| Cookie | HTTP請求發送時,會把保存在該請求域名下的所有cookie值一起發送給服務端。 | Cookie: onemore=萬貓學社; |
| Content-Length | 請求的內容長度 | Content-Length: 1024 |
| Content-Type | 請求的與實體對應的MIME信息 | Content-Type: application/x-www-form-urlencoded |
| Date | 請求發送的日期和時間 | Date: Mon, 16 Mar 2020 11:11:11 GMT |
| Expect | 請求的特定的服務端行為 | Expect: 100-continue |
| Host | 指定請求的服務端的域名和端口號 | Host: onemore.study |
| If-Match | 只有請求內容與實體相匹配才獲取該數據 | If-Match: "306073f04224cbd114f14693c272f6a0" |
| If-Modified-Since | 如果請求的部分在指定時間之后被修改則請求成功。 | If-Modified-Since: Mon, 16 Mar 2020 11:11:11 GMT |
| If-None-Match | 只有請求內容與實體不匹配才獲取該數據。 | If-None-Match: "306073f04224cbd114f14693c272f6a0" |
| If-Range | 允許對數據的某個范圍進行條件請求。 | If-Range: "306073f04224cbd114f14693c272f6a0" |
| If-Unmodified-Since | 只有在指定時間之后未被修改才請求成功。 | If-Unmodified-Since: Mon, 16 Mar 2020 11:11:11 GMT |
| Max-Forwards | 將請求轉發給其他代理或網關的最大次數。 | Max-Forwards: 10 |
| Pragma | 用來包含實現特定的指令 | Pragma: no-cache |
| Proxy-Authorization | 連接到代理的授權證書 | Proxy-Authorization: Basic b25lbW9yZSUzQSV1NEUwNyV1NzMyQiV1NUI2NiV1NzkzRQ== |
| Range | 只請求數據的一部分,指定范圍 | Range: bytes=512-1024 |
| Referer | 先前資源的URL | Referer: http://onemore.study |
| TE | 客戶端願意接受的傳輸編碼 | TE: trailers,deflate;q=0.5 |
| User-Agent | 包含發出請求的客戶端信息 | User-Agent: Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:65.0) |
響應報文的頭部信息
| Header | 含義 | 示例 |
|---|---|---|
| Age | 從原始服務端到代理緩存形成的估算時間(以秒計,非負) | Age: 12 |
| Allow | 對某資源的有效的請求行為 | Allow: GET, POST |
| Cache-Control | 告訴所有的緩存機制是否可以緩存及哪種類型。 | Cache-Control: no-cache |
| Content-Encoding | 服務端支持的返回內容壓縮編碼類型。 | Content-Encoding: gzip |
| Content-Language | 響應體的語言 | Content-Language: zh-CN,zh |
| Content-Length | 響應體的長度 | Content-Length: 1024 |
| Content-Location | 請求資源實際所處位置 | Content-Location: /index.do |
| Content-MD5 | 返回資源的MD5校驗值 | Content-MD5: 306073f04224cbd114f14693c272f6a0 |
| Content-Range | 在整個返回資源中本部分的字節位置 | Content-Range: bytes 512-1024 |
| Content-Type | 返回資源的對象類型 | Content-Type: text/html; charset=GBK |
| Date | 原始服務端消息發出的時間 | Date: Mon, 16 Mar 2020 11:11:11 GMT |
| ETag | 請求變量的實體標簽的當前值 | ETag: "306073f04224cbd114f14693c272f6a0" |
| Expires | 響應過期的日期和時間 | Expires: Mon, 16 Mar 2020 11:11:11 GMT |
| Last-Modified | 請求資源的最后修改時間 | Last-Modified: Mon, 16 Mar 2020 11:11:11 GMT |
| Location | 告知客戶端資源的實際URL | Location: http://onemore.study |
| Pragma | 包括實現特定的指令 | Pragma: no-cache |
| Proxy-Authenticate | 它指出認證方案和可應用到代理的該URL上的參數 | Proxy-Authenticate: Basic |
| Retry-After | 如果實體暫時不可取,通知客戶端在指定時間之后再次嘗試 | Retry-After: 60 |
| Server | 服務端軟件名稱 | Server: Microsoft-IIS/8.5 |
| Set-Cookie | 設置Http Cookie | Set-Cookie: onemore=萬貓學社; |
| Transfer-Encoding | 文件傳輸編碼 | Transfer-Encoding:chunked |
| Vary | 告知下游代理是使用緩存響應還是從原始服務端請求 | Vary: * |
| Via | 告知代理客戶端響應是通過哪里發送的 | Via: HTTP/1.1 GWA |
| WWW-Authenticate | 表明客戶端請求實體應該使用的授權方案 | WWW-Authenticate: Basic |
微信公眾號:萬貓學社
微信掃描二維碼
獲得更多Java技術干貨
