HTTP
- HTTP協議用於客戶端和服務端之間的通訊
- 經過請求和響應進行通訊,請求由客戶端發出,響應由服務器端回覆
- 無狀態協議,不保存狀態信息,爲了實現保存狀態信息,引入了cookie
- 1.客戶端發起第一次請求
- 2.服務器端,生成Cookie信息,經過set-Cookie首部字段信息,通知客戶端保存Cookie
- 3.下一次客戶端請求時,客戶端會自動在請求報文上添加Cookie信息
- 4.服務器端收到,對比服務器上的內容,斷定用戶是誰
- 持久鏈接:最初HTTP,每進行一次HTTP通訊,就要斷開一次TCP鏈接,HTTP/1.1 引入了持久鏈接keep-alive,若是任意一端沒有明確提出斷開鏈接,則保存TCP鏈接
- 管線化:之前,發送請求需等待並收到響應以後,才能發送下一個請求,引入管線化技術以後,能夠同時並行發送多個請求,而不須要等待響應了
HTTP報文
HTTP報文大體可分爲報文首部和報文主體部分
報文主體 = 實體主體
實體 = 實體首部 + 實體主體
⚠️報文主體不是必須的,報文主體傳送的內容,是應該被髮送的數據
例如:
- 1.用戶只是想獲取資源,使用GET方法,請求報文的報文主體就沒有內容了
- 2.用戶向服務器傳送文件,使用PUT方法,在請求報文的報文主體包含傳送內容
- 3.服務器返回用戶請求的資源,在響應報文的報文主體中包含請求資源
- 4.服務器返回304狀態碼時,告訴用戶使用未過時的緩存,響應報文的報文主體爲空
請求報文首部
請求行 = 請求方法 + 請求UR I+ 協議版本號 GET /index.html HTTP/1.1
請求訪問某臺HTTP服務器上的/index.html頁面資源
請求方法
- GET:獲取資源
- POST:傳輸請求報文主體,目的不在於獲取響應的報文主體
- PUT:傳輸文件,在請求報文主體中加入文件內容
- HEAD:與GET方法同樣,不過不返回報文主體內容
- DELETE:刪除文件
- OPTIONS:詢問支持的方法,查詢指定資源支持的方法
- TRACE:追蹤路徑
- CONNECT:要求用隧道協議鏈接代理
響應報文首部
狀態行 = 協議版本號 + 狀態碼數值 + 緣由短語 HTTP/1.1 200 OK
狀態碼
狀態碼 = 狀態碼數值 + 緣由短語html
-
狀態碼類別
- 1XX:信息性狀態碼--------------接收的請求正在被處理
- 2XX:成功狀態碼----------------請求正常處理完畢
- 3XX:重定向狀態碼--------------須要進行附加操做以完成請求
- 4XX:客戶端錯誤狀態碼---------服務器沒法處理請求
- 5XX:服務器端錯誤狀態碼-------服務器處理請求出錯
⚠️只要遵循狀態碼列表的定義,即便改變RFC2616中定義的狀態碼,或服務器端自行建立狀態碼都沒問題
-
常見狀態碼
- 200 OK----------------------------表示服務器端正常處理了客戶端發來的請求
不過,不一樣的請求方法,會獲得不一樣的結果
使用GET方法時,對應的請求資源會做爲響應返回;
使用HEAD方法時,對應資源則不會做爲響應返回,只返回報文首部,服務器被動不返回報文主體
- 204 NO Content-------------------請求處理成功,但沒有資源返回
響應報文中不含報文主體,服務器主動不返回報文主體
- 206 Partial Content----------------客戶端進行了範圍請求
實際上服務器上成功的執行了GET請求,可是客戶端要求,返回指定範圍內的數據
- 301 Moved Permanently-----------永久性重定向
客戶端訪問的資源,被服務器端永久的分配了新的URI(統一資源標識符),此時服務器端在響應報文中添加Location首部字段,客戶端保存提示的URI,自動根據新的URI再次發鬆請求,獲得數據
- 302 Found-------------------------臨時性重定向
服務器端臨時移動了資源,服務器帶有新的URI響應,客戶端不保存新的URI,自動根據新的URI發送請求,獲得數據
- 303 See Other---------------------URI已經更新,明確提示客戶端使用GET方法請求獲取資源
與301,302對比,301,302 沒有明確指定客戶端下一次的請求方法,
可是,其實幾乎全部的瀏覽器都會把POST改爲GET,並刪除請求報文中的報文主體部分
- 304 Not Modified--------------資源已找到,但不符合客戶端傳來的條件
其實與重定向沒有關係,表示,客戶端直接使用了未過時的緩存
- 307 Temporary Redirect------臨時重定向
與302 相同,但307不會改變請求方法
- 400 Bad Request-------------請求中存在語法錯誤
- 401 Unauthorized-------------請求中的認證失敗
- 403 Forbidden----------------服務器端不容許訪問該資源
- 404 Not Found----------------服務器上沒有該資源,或服務器端拒絕請求且不想說明理由
- 500 Internal Server Error-------服務器端發生了內部故障
- 503 Service Unavailable--------服務器暫時處於超負荷或正在進行停機維護狀態