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.36
Accept
:指定客戶端能夠接受的內容型別,內容型別的先後順序表示客戶端接受的先後順序。
比如:Accept:text/html,application/xml
Accept-Charset
:客戶端接受的字符集,如gb2312
,iso-8859-1
。Accept-Encoding
:指定客戶端瀏覽器可以支援的web伺服器返回內容壓縮編碼型別,允許伺服器在將輸入內容傳送到客戶端以前進行壓縮,以節約頻寬,節省傳輸時間,提交傳輸效率。
比如:Accept-Encoding:gzip,deflate
Accept-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
伺服器錯誤,伺服器在處理請求的過程中發生了錯誤。 - 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格式等,也可以沒有資料的返回。