序言
本文主要通過HTTP 報文,講解HTTP Header,Methods,status code
HTTP
HTTP基於TCP協議實現,TCP是一條雙向通訊通道,HTTP在TCP的基礎上規定了Request->Response的模式;也就是說:必須由瀏覽器首先發起請求,伺服器才會響應。
HTTP是一個純粹的文字協議,它規定了使用TCP協議來傳輸文字格式的一個應用協議,具體可以參考一下計算機網路的五層協議。
名詞解釋
-
URL:統一資源定位符——定位到位置 如:www.baidu.com/
-
URI:統一資源標記符——定位到名字 如:www.baidu.com/index.html URI = URL (www.baidu.com/) + URN (index.html)
Request->Response「請求->響應」
http通訊中,必須由客服端發起請求,服務端才能響應。
Request 請求報文
-
method -> 請求方式「GET POST OPTIONS ...」
-
path -> 獲取資源的路徑
-
version -> 請求版本 「HTTP的協議版本號」
-
headers -> 頭部 「cookies...」
-
body -> 請求主體 「主要提交的一些資料」
Response 響應報文
-
version -> 響應協議版本號
-
status -> 狀態碼「200 404 403... 用來反饋請求的成功失敗已經原因」
-
headers -> 頭部跟請求頭類似 「cookies...」
-
body -> 響應的一些資源資訊
幾個重點結構
HTTP Method(方法)
http method定義了我們請求希望執行的操作型別,主要有以下幾種:
-
GET get「獲取」是一種最常用的請求方式,一般用來直接通URI訪問來獲取資源。譬如:獲取html程式碼,圖片,JSON等資源
-
POST post「提交」也是一個更常用的方式,主要用來提交表單資訊給後臺儲存修改驗證。譬如:提交使用者名稱與密碼驗證身份
-
HEAD 跟get相同,不過只返回請求頭多數由 JavaScript 發起
-
PUT && DELETE 新增跟刪除資源
-
CONNECT 用於 HTTPS和 WebSocket
-
OPTIONS && TRACE 用於預請求和除錯,後面會講到
狀態碼 State code
這部分很重要,在開發除錯中,往往需要根據狀態碼判斷bug出現的原因,下面挑幾個重要的講一下:
1xx 資訊響應
用處不大
-
2xx 成功響應
-
200 OK 請求成功
-
201 Created 建立成功 -> 一般是在傳送PUT「新增」請求後的響應
-
202 Accepted 請求已收到 -> 你的請求我已經收到了但我不還不想處理 ...
3xx 重定向
-
301 Moved Premanently 資源已經永久轉移了
-
302 Found 臨時從其他URI 響應資訊
-
304 Not Modified 本地有快取版本並且沒有過期
4xx 客戶端響應
這些狀態主要是客戶端傳送的請求不符合服務端的規格要求,返回的狀態資訊
-
400 Bad Request 錯誤請求 -> 這個請求我不知道你在說什麼
-
401 Unathorized 未授權 -> 這個請求你需要提交使用者驗證資訊「Authorization」
-
403 Forbidden 請求是對但拒絕執行,具體原因不知「傲嬌臉」
-
404 Not Found 請求的資源不存在
-
405 Method Not Allowed 請求方式拒絕 -> 這個請求方式「如:post」不允許
5xx 服務端響應
這些狀態主要是服務端自己發生錯誤
-
500 Internal Server Error 服務端錯誤 -> 服務端出錯具體原因不清楚
-
502 Bad Gateway 閘道器出錯
-
503 Service Unavailable 伺服器掛了
-
504 Gateway Timeout 響應超時了
-
505 HTTP Version Not Supported 你這個請求協議我不支援啊
HTTP Header(HTTP頭)
格式:「名稱(不區分大小寫)」: 「具體的值」 幾個常見的:- Accept-Encoding/Content-Encoding允許/返回的資料壓縮方式
有一次業務上線後測試工程師告訴我網頁開啟太慢了,檢視了network後發現打包庫好幾M,但是用本地編譯測試沒有也就幾百K而已。後來通過查詢content-encoding發現線上nginx沒有配置gzip壓縮
- Access-Control-Allow-Methods 預請求允許返回的請求方式
當發生405錯誤的時候,可以查詢伺服器允許你請求的方式有哪些
- Access-Control-Allow-Origin 允許誰訪問,萬用字元 '*'
當發生跨域的時候,一般是這個沒有設定
- Authorization 傳送驗證資訊
一般在返回401的時候,就是沒有設定這個
- Content-Type 實體頭部用於指示資源的MIME型別 media type
格式:type/subtype 「型別」/「子型別」
獨立型別:
- text: 表示可讀文字常見
text/plain「未知可直接展示」, text/html, text/css, text/javascript, text/xml
-
image:影像 ...
-
audio:音訊 ...
-
video:視訊 ...
-
applcation: 二進位制資料 常見 application/json 表示資料是json格式的
對於text檔案型別若沒有特定的subtype,就使用 text/plain。類似的,二進位制檔案沒有特定或已知的 subtype,即使用 application/octet-stream。
Multipart 型別:
-
Multipart 型別表示細分領域的檔案型別的種類,經常對應不同的 MIME 型別
-
multipart/form-data: 一般用來檔案直接通過HTML Forms的POST提交
我們使用 html 的 form 標籤提交產生的 html提交的時候,預設產生application/x-www-form-urlencoded,當有檔案的時候使用multipart/form-data