1. 程式人生 > 實用技巧 >需要知道的HTTP 知識

需要知道的HTTP 知識

一、TCP/IP網路模型

TCP/IP模型借鑑於OSI七層網路模型,將會話層、表示層、應用層合併到應用層

各層之間傳輸資料時,會按照各自的協議進行封包和解包。傳送端傳輸時打上該層所屬的首部資訊,接收端每經過一層則將對應首部資訊去除

二、HTTP 報文結構

(一)請求報文

請求行

請求方法 /請求檔案URI路徑 /HTTP版本

GET /home HTTP/1.1

(二)響應報文

狀態行

HTTP版本 /狀態碼 /原因短語

HTTP/1.1 200 OK

三、HTTP 的請求方法

http/1.1規定以下請求方法

  • GET: 通常用於獲取資源
  • POST: 提交資料,即上傳資料
  • HEAD: 獲取資源的元資訊
    • 與GET方法相同,但不返回報文主體
    • 用於確認 URI 的有效性及資源更新的日期時間等
  • PUT: 用來傳輸檔案,但HTTP/1.1不帶驗證機制
    • 請求報文的主體中包含檔案內容
    • 將檔案儲存到請求URI中
  • DELETE:刪除資源,但HTTP/1.1不帶驗證機制
  • OPTIONS:查詢資源支援的請求方法
  • CONNECT: 建立連線隧道,用於代理伺服器
  • TRACE: 追蹤請求-響應的傳輸路徑

GET 和 POST 有什麼區別

  • 語義的角度
    • GET請求資源,POST提交資料
  • 引數的角度
    • GET引數通過URL傳遞,POST放在Request body中更適合傳遞敏感資訊
    • GET請求在URL中傳送的引數是有長度限制的(2k),而POST沒有
  • 編碼的角度
    • GET 只能進行 URL 編碼,只能接收 ASCII 字元,而 POST 沒有限制
  • 冪等性的角度
    • GET是冪等的,而POST不是 (表示執行相同的操作,結果也是相同的)
  • 瀏覽器行為的角度
    • GET 請求會被瀏覽器主動快取下來,留下歷史記錄,而 POST 預設不會
    • GET產生的URL地址可以被Bookmark,而POST不可以
    • GET在瀏覽器回退時是無害的,而POST會再次提交請求
  • TCP的角度
    • GET產生一個TCP資料包,POST產生兩個TCP資料包
      • 對於GET方式的請求,瀏覽器會把http header和data一併傳送出去,伺服器響應200返回資料
      • 對於POST,瀏覽器先發送header,伺服器響應100 continue,瀏覽器再發送data,伺服器響應200 ok 返回資料
      • 火狐瀏覽器除外,POST 請求只發一個 TCP 包

四、理解URI

URI全稱為(Uniform Resource Identifier), 也就是統一資源識別符號。用於區分網際網路上的資源

(一)URI 的結構

  • http 和 https 的預設埠分別為80、443

(二)URI 編碼

  • URI 只能使用ASCII, ASCII 之外的字元是不支援顯示的
  • URI 引入了編碼機制,將所有非 ASCII 碼字元界定符轉為十六進位制位元組值,然後在前面加個%

五、理解 HTTP 狀態碼

(一) 1XX Informational (資訊性狀態碼)

表示臨時響應並需要請求者繼續執行操作

100 Continue 繼續

請求者應當繼續提出請求。伺服器返回此程式碼表示已收到請求的第一部分,正在等待其餘部分

101 Switching Protocols 切換協議

請求者已要求伺服器切換協議,伺服器已確認並準備切換

(二) 2XX Success(成功狀態碼)

表示成功處理了請求的狀態碼

200 OK 成功

伺服器已經成功處理請求。通常表示伺服器提供了請求的網頁

201 Created 已建立

請求成功並且伺服器建立了新的資源

202 Accepted 已接受

伺服器已接受請求,但尚未處理

203 Non-Authoritative Information 未授權資訊

伺服器已經成功處理了請求,但返回的資訊可能來自另一來源

204 No Content 無內容

請求成功處理,客戶端請求的資源存在,但其表示是空的

若伺服器拒絕對PUT、POST或者DELETE請求返回任何狀態資訊或表示,通常採用此響應程式碼

205 Reset Content 重置內容

與204類似,表明客戶端應重置資料來源的檢視或資料結構

206 Partial Content 部分內容

表示客戶端進行範圍請求,服務端成功執行

用於對部分GET請求(即使用Range請求報頭的GET請求)的響應,常用於大型二進位制檔案的斷點續傳

(三) 3XX Redirection(重定向狀態碼)

表示要完成請求,需要進一步操作。通常用來重定向

300 Multiple Choices 多重選擇

被請求的資源在伺服器端存在多個表示,而伺服器不知道客戶端想要的是哪一個表示時,傳送這個響應程式碼

301 Moved Permanently 永久移動

請求的網頁已永久移動到新位置。對GET或HEAD請求的響應伺服器返回此響應時,會自動將請求者轉到新位置

302 Found 臨時移動

伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求

比如你的網站從 HTTP 升級到了 HTTPS 了,以前的站點再也不用了,應當返回301,這個時候瀏覽器預設會做快取優化,在第二次訪問的時候自動訪問重定向的那個地址
而如果只是暫時不可用,那麼直接返回302即可,和301不同的是,瀏覽器並不會做快取優化

303 See Other 檢視其它位置

請求者應當對不同的位置使用單獨的GET請求來檢索響應時,伺服器返回此程式碼

請求已經被處理,但伺服器不是直接返回一個響應文件,而是返回一個響應文件的URI

304 Not Modified 未修改

自動上次請求後,請求的網頁未修改過。伺服器返回此響應,不會返回網頁的內容

305 Use Proxy 使用代理

請求者只能使用代理訪問請求的網頁。如果伺服器返回此響應,還表示請求者應使用代理

307 Temporary Redirect 臨時性重定向

伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有的位置來進行以後的請求

(四) 4XX Client Error(客戶端錯誤狀態碼)

表示請求可能出錯,妨礙了伺服器的處理

400 Bad Request 錯誤請求

伺服器不理解請求的語法

401 Unauthorized 未授權

請求要求身份驗證。對於需要登入的網頁,伺服器可能返回此響應

403 Forbidden 禁止

客戶端請求的結構正確,但伺服器拒絕請求

404 Not Found 未找到

伺服器找不到請求的網頁

405 Method Not Allowd 方法禁用

禁用請求中指定的方法

406 Not Acceptable 不接受

當客戶端對錶示有太多要求,以至於伺服器無法提供滿足要求的表示

407 Proxy Authentication Required 需要代理授權

此狀態碼與401(未授權)類似,但指定請求者應當授權使用代理

408 Reqeust Timeout 請求超時

伺服器等候請求時發生超時

409 Conflict 衝突

請求的操作會導致伺服器的資源處於一種不可能或不一致的狀態

伺服器在完成請求時發生衝突。伺服器必須在響應中包含有關衝突的資訊

410 已刪除

如果請求的資源已永久刪除,伺服器就會返回此響應

411 需要有效長度

伺服器不接受不含有效內容長度標頭欄位的請求

412 未滿足前提條件

伺服器未滿足請求者在請求者設定的其中一個前提條件

413 Request Entity Too Large 請求實體過大

伺服器無法處理請求,因為請求實體過大,超出了伺服器的處理能力

414 Request-URI Too Long: 請求的URI過長

請求的URI(通常為網址)過長,伺服器無法處理

415 不支援媒體型別

請求的格式不受請求頁面的支援

416 請求範圍不符合要求

如果頁面無法提供請求的範圍,則伺服器會返回此狀態碼

417 未滿足期望值

伺服器未滿足“期望”請求標頭欄位的要求

(五) 5XX Server Error(伺服器錯誤狀態碼)

表示伺服器在嘗試處理請求時發生內部錯誤。這些錯誤可能是伺服器本身的錯誤,而不是請求出錯

500 Internal Server Error 伺服器內部錯誤

伺服器遇到錯誤,無法完成請求

501 Not Implemented 尚未實施

伺服器不具備完成請求的功能。例如,伺服器無法識別請求方法時可能會返回此程式碼

502 Bad Gateway 錯誤閘道器

伺服器作為閘道器或代理,從上游伺服器無法收到無效響應

503 Service Unavailable 伺服器不可用

伺服器目前無法使用(由於超載或者停機維護)。通常,這只是暫時狀態

504 閘道器超時

伺服器作為閘道器代理,但是沒有及時從上游伺服器收到請求

505 HTTP版本不受支援

伺服器不支援請求中所用的HTTP協議版本

https://juejin.im/entry/586b5b7dac502e12d62b4f33

https://juejin.im/post/5e76bd516fb9a07cce750746#heading-10