1、HTTP協議介紹
HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網(WWW:World Wide Web )服務器傳輸超文本(也可以說是資源)到本地瀏覽器的傳送協議。
HTTP協議是基於TCP協議的應用層協議,它不關心數據在底層傳輸的細節(底層細節需要很多網絡方面的知識,這里不擴展說明),主要是用來規定客戶端和服務端的數據傳輸格式(就是定義一種標准),默認端口是80。
http是基於請求與響應模式的、無狀態的、應用層的協議。
2、使用Fiddler抓取一個請求
開啟Fiddler工具,在瀏覽器中發送一個HTTP請求,之后在Fiddler中就會抓取到該請求。
雙擊抓取的請求鏈接,在右側窗口就會顯示出該請求的請求報文和響應報文內容,如下圖:

我們也可以一個請求保存到本地,
選中該HTTP請求:點擊右鍵 —> Save —> Selected Sessions —> as Text...
把該HTTP請求的請求報文和響應報文存儲到一個text文件中。
文件中的內容如下所示:
===========請求報文:也就是客戶端發給服務器的數據=============
GET http://127.0.0.1:8000/api/departments/ HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
=========響應報文:=======================
HTTP/1.0 200 OK
Date: Wed, 13 Jan 2021 14:59:00 GMT
Server: WSGIServer/0.2 CPython/3.5.4
Vary: Cookie
Content-Type: application/json
Content-Length: 1789
X-Frame-Options: SAMEORIGIN
Allow: GET, POST, DELETE
{
"count":3,
"next":null,
"previous":null,
"results":[
{
"dep_id":"T02",
"dep_name":"Java_2學院",
"master_name":"Java-Master",
"slogan":"java"
},
{
"dep_id":"T03",
"dep_name":"Java_3學院",
"master_name":"Java-Master",
"slogan":"java"
},
{
"dep_id":"T04",
"dep_name":"C++/學院",
"master_name":"C++-Master",
"slogan":"Here is Slogan"
}
]
}
3、НТТP請求報文
(1)НТТP請求報文說明
HTTP請求報文主要由請求行、請求頭部、空一行、請求正文4部分組成。
請求正文也可以說成請求體,請求體可能有如Get請求,也可能沒有如POST請求。
HTTP請求報文協議格式:

在Fiddler中抓取的請求中,在請求頭部信息中,點擊raw選項就可以看到如下信息。

(2)請求行
請求行分為三部分:
- 請求方法:Request Method
請求方法 備注 GET請求資源 POST提交資源 Head獲取響應頭 PUT替換資源 DELETE刪除資源 OPTIONS允許客戶端查看服務器的性能 TRACE回顯服務器收的請求,用於測試或診斷 - 統一資源標識符
名稱:Uniform Resource Locator:統一資源定位符。
作用:用於描述網上的資源。
格式:schema://host[:port#]/path/.../[?query-string]
說明:
schema:協議,如http,https,ftp等。
host:域名或者IP地址。
port:端口。
path:資源路徑。
query-string:發送的參數。
例如:https://www.baidu.com/s?ie=UTF-8&wd=圖片 - HTТP協議版本:
HTTP/1.1是現在比較常用的版本。
(3)請求頭(Request Header)
常見請求頭屬性如下:
Host:所請求web服務器的IP地址或域名:例:www.baidu.com。User-Agent:HTTP客戶端運行的瀏覽器類型,詳情。
后台可以根據該頭部信息,判斷當前的HTTP請求的客戶端瀏覽器類型。
例如:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36Accept:指定客戶端能夠接受的內容類型,內容類型的先后順序表示客戶端接受的先后順序。
比如:Accept:text/html,application/xmlAccept-Charset:客戶端接受的字符集,如gb2312,iso-8859-1。Accept-Encoding:指定客戶端瀏覽器可以支持的web服務器返回內容壓縮編碼類型,允許服務器在將輸入內容發送到客戶端以前進行壓縮,以節約帶寬,節省傳輸時間,提交傳輸效率。
比如:Accept-Encoding:gzip,deflateAccept-Language:指定HTTP客戶端瀏覽器用來展示返回信息所先選擇的語言。
也就是指定客戶端接收的語言。
比如:Accept-Language:zh-cn,zh;q=0.5后面的q表示權重。Cookie:http請求發送時,會把保存在該請求域名下的所有cookie值一起發送給web服務器。Referer:包含一個url,用戶從該url的頁面觸發訪問當前請求的頁面。
即從哪個鏈接過來的。(可以做統計和防止盜鏈)Content-Type:顯示此HHTP請求提交的內容類型。
比如:Content-Type:application/x-www-form-urlencoded;charset:UTF-8
"application/x-www-form-urlencoded"是瀏覽器的默認值,表示表單數據向服務器提交時所采用的編碼類型。Content-Length:用於描述HTTP消息實體的傳輸長度。
需要注意的是:在HTTP協議中,消息實體的長度和消息實體的傳輸長度是有區別的。
比如說gzip壓縮下,消息實體長度是壓縮前的長度,但是消息實體的傳輸長度是gzip壓縮后的長度。Connection:表示是否需要持久連接。比如:Connection:keep-Alive。X-Requested-With:用來判斷客戶端的請求是Ajax請求(異步)還是其他請求(同步)。
后台可以利用request.getHeader("x-requested-with")為null判斷是同步請求,為XMLHttpRequest則是Ajax異步請求。
例:X-Requested-With:XMLHttpRequest。Origin:跨域的時候,Get和Post請求都會顯示origin,同域的時候Get不顯示origin,Post顯示origin。Authorization:客戶端提供服務端,進行權限認證的信息。Cache-Control:緩存機制,如Cache-Control:no-cache。Pragma:防止頁面被緩存,和Cache-Control:no-cache作用一樣。
(4)請求體
就是請求需要攜帶的數據。沒什么可說的,有就顯示。
4、НТТР響應報文
(1)НТТP響應報文說明
HTTP響應報文主要由狀態行、消息報頭、空一行、響應正文4部分組成。
HTTP響應報文協議格式:

在Fiddler中抓取的請求中,在響應報文中,點擊raw選項就可以看到如下信息。

(2)響應行
響應行分為三部分:
- HTТP協議版本:
HTTP/1.1是現在比較常用的版本。 - 狀態碼(
Status Code)
用以表示網頁服務器HTTP響應狀態的3位數字代碼。狀態碼 描述 1XX信息,服務器收到請求,需要請求者繼續執行操作。 2XX成功,操作被成功接收並處理。 3XX重定向,需要進一步的操作以完成請求。 4XX客戶端錯誤,請求包含語法錯誤或無法完成請求。 5XX服務器錯誤,服務器在處理請求的過程中發生了錯誤。 下面是常見的HTTP狀態碼: - 200 - 請求成功。
- 301 - 資源(網頁等)被永久轉移到其它URL。
- 404 - 請求的資源(網頁等)不存在。
- 500 - 內部服務器錯誤。
- HTTP狀態碼列表:
狀態碼 狀態碼英文名稱 中文描述 100 Continue繼續。客戶端應繼續其請求 101 Switching Protocols切換協議。服務器根據客戶端的請求切換協議。只能切換到更高級的協議,例如,切換到HTTP的新版本協議 200 OK請求成功。一般用於GET與POST請求 201 Created已創建。成功請求並創建了新的資源 202 Accepted已接受。已經接受請求,但未處理完成 203 Non-Authoritative Information非授權信息。請求成功。但返回的meta信息不在原始的服務器,而是一個副本 204 No Content無內容。服務器成功處理,但未返回內容。在未更新網頁的情況下,可確保瀏覽器繼續顯示當前文檔 205 Reset Content重置內容。服務器處理成功,用戶終端(例如:瀏覽器)應重置文檔視圖。可通過此返回碼清除瀏覽器的表單域 206 Partial Content部分內容。服務器成功處理了部分GET請求 300 Multiple Choices多種選擇。請求的資源可包括多個位置,相應可返回一個資源特征與地址的列表用於用戶終端(例如:瀏覽器)選擇 301 Moved Permanently永久移動。請求的資源已被永久的移動到新URI,返回信息會包括新的URI,瀏覽器會自動定向到新URI。今后任何新的請求都應使用新的URI代替 302 Found臨時移動。與301類似。但資源只是臨時被移動。客戶端應繼續使用原有URI 303 See Other查看其它地址。與301類似。使用GET和POST請求查看 304 Not Modified未修改。所請求的資源未修改,服務器返回此狀態碼時,不會返回任何資源。客戶端通常會緩存訪問過的資源,通過提供一個頭信息指出客戶端希望只返回在指定日期之后修改的資源 305 Use Proxy使用代理。所請求的資源必須通過代理訪問 306 Unused已經被廢棄的HTTP狀態碼 307 Temporary Redirect臨時重定向。與302類似。使用GET請求重定向 400 Bad Request客戶端請求的語法錯誤,服務器無法理解 401 Unauthorized請求要求用戶的身份認證 402 Payment Required保留,將來使用 403 Forbidden服務器理解請求客戶端的請求,但是拒絕執行此請求 404 Not Found服務器無法根據客戶端的請求找到資源(網頁)。通過此代碼,網站設計人員可設置"您所請求的資源無法找到"的個性頁面 405 Method Not Allowed客戶端請求中的方法被禁止 406 Not Acceptable服務器無法根據客戶端請求的內容特性完成請求 407 Proxy Authentication Required請求要求代理的身份認證,與401類似,但請求者應當使用代理進行授權 408 Request Time-out服務器等待客戶端發送的請求時間過長,超時 409 Conflict服務器完成客戶端的 PUT 請求時可能返回此代碼,服務器處理請求時發生了沖突 410 Gone客戶端請求的資源已經不存在。410不同於404,如果資源以前有現在被永久刪除了可使用410代碼,網站設計人員可通過301代碼指定資源的新位置 411 Length Required服務器無法處理客戶端發送的不帶Content-Length的請求信息 412 Precondition Failed客戶端請求信息的先決條件錯誤 413 Request Entity Too Large由於請求的實體過大,服務器無法處理,因此拒絕請求。為防止客戶端的連續請求,服務器可能會關閉連接。如果只是服務器暫時無法處理,則會包含一個Retry-After的響應信息 414 Request-URI Too Large請求的URI過長(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 Time-out充當網關或代理的服務器,未及時從遠端服務器獲取請求 505 HTTP Version not supported服務器不支持請求的HTTP協議的版本,無法完成處理
(3)響應頭(Response Header)
常見響應頭屬性如下:
Server:web服務器或者HTTP服務器的軟件信息(名稱)。Date:告訴客戶端響應報文發出的時間。Expires:告訴客戶端緩存過期的時間。Set-Cookie:設置Cookie。
把一段文本,寫到cookie中,下次客戶端在來訪問的時候,帶上這段cookie,就可以免登陸。Last-Modified:所請求的資源,最后的修改時間。
通過設個時間可以和本地緩存的資源進行比對,如果時間沒有改變,
就進行重定向,直接從服務器返回,在本地拿數據就可以了。Content-Type:返回響應內容的類型和字符集,例如:Content-Type: text/html;charset=utf-8。Content-Length:告訴客戶端響應體的長度,web服務器返回消息正文的長度。Connection:在HTTP1.1中request header和reponse header中都有可能出現一個Connection頭字段,Connection屬性的含義是當Client和Server通信時,對於長鏈接如何進行處理。
在HTTP1.1中,Client和Server都是默認對方支持長鏈接的,
如果Client使用HTTP1.1協議,但又不希望使用長鏈接,則需要在header中指明Connection的值為close;
如果Server端也不想支持長鏈接,則在response中也需要明確說明Connection的值為close。Location:指明重定向的位置,新的URL地址,如304的情況。Accept-Ranges:表明服務器是否支持指定范圍的請求,比如bytes,表明支持字節請求。Access-Control-Allow-Origin:在服務器響應客戶端的時候,如果設置Access-Control-Allow-Origin:*,則允許所有域名的腳本訪問該資源。Age:從原始服務器到代理緩存形成的估算時間,單位為秒。Cache-Control:告訴所有的緩存機制是否可以緩存,已經緩存的類型。例如:cache-control : no-cache。
(4)響應體
就是服務器返回的數據,可以是任何格式的數據,例如:Json格式,文本格式,HTML格式,XML格式等,也可以沒有數據的返回。
