Http協議的格式及實例

協議

Http協議位於網絡五層結構的最上層應用層。它建立在TCP協議之上,是個無狀態的協議,典型的應用是網絡瀏覽器以及移動端數據傳輸。本文將介紹Http請求的格式,並對請求數據的各部分做一個詳細介紹。

處於不同層次的網絡協議

Http協議包括多個方法:Get,Post,Put,Delete,Head,Patch,Options等。我們重點關注最常用的Get和Post請求。

一次請求包括兩個過程,Request過程和Response過程,Request過程發出數據請求,攜帶請求的各項參數,Response過程返回請求的數據。

Http Request

Http Request包括三部分:請求行,請求頭和請求體。

第一行是請求行,格式是:方法+路徑+Http版本,以空格分隔。從第二行開始是請求頭,由若干個鍵值對構成,每個鍵值對一行。請求頭結束後空一行,接着是請求體。

POST請求的參數放在請求體裏,GET請求沒有請求體,請求的參數以鍵值對的形式存放在path裏面。請求頭裏的鍵值對包括預定義鍵值對和自定義鍵值對,鍵值對內容包括請求的Host,User-agent,編碼方式,請求體的類型,請求體的長度,分隔符等等信息,大部分都是可選的,我們也可以隨意添加自定義的鍵值對來滿足某些需求。下面是一個Post請求的實例:

Post Request實例

Http Response

Http Response也包括三部分:響應狀態行,響應頭和響應體。

第一行是響應狀態行包括Http版本+響應狀態,以空格分隔。從第二行開始是響應頭,包含若干個鍵值對,每個鍵值對佔一行。後面空一行,接着是響應體。

Http Response實例

請求體可以包括多個part,通過header裏面的分隔符分隔,比如音頻上傳時利用請求體裏兩個part分佈存儲文件類型和音頻數據。

含多個part的Request Body

User-agent鍵值對

Http Request Header裏有個user-agent字段,是用來存放發起請求的客戶端或者瀏覽器的標識信息的,比如瀏覽器的名稱版本,操作系統的名稱版本,客戶端的名稱版本等。

瀏覽器的user-agent:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36

webview原始user-agent:

Mozilla/5.0 (Linux; U; Android 4.2.1; zh-cn; MI 3 Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

我們自己在後面追加
Chunyuyisheng/7.3.0 (iPhone; iOS 8.4; Scale/2.00) ,注意第一個有空格,方便隔開原始字符串,以便服務器正則判斷

最後生成類似 下面的字符串:

Mozilla/5.0 (Linux;
U; Android 4.2.1; zh-cn; MI 3 Build/JOP40D) AppleWebKit/534.30 (KHTML, like
Gecko) Version/4.0 Mobile Safari/534.30 Chunyuyisheng/7.3.0 (iPhone; iOS 8.4;
Scale/2.00)

user-agent就是一個存放發起請求的端一些附加信息的地方,至於具體寫入啥是由客戶端和服務器協商決定的,沒有硬性標準。

Cookie鍵值對

Cookie鍵值對存儲的是一些標誌用戶身份或設置的信息,如session ID,language等。用戶通過瀏覽器首次訪問某個網站的時候,服務器生成一個cookie,並把它放在http響應的header裏面,下次再次訪問該網站的時候,瀏覽器會在http請求的header裏面帶上這個cookie值,服務器可以建立一個cookie值到用戶表的映射,然後就可以利用這個識別用戶。

最基本的Cookie:

==Server -> User Agent ==
Set-Cookie: SID=31d4d96e407aad42
==User Agent -> Server ==
Cookie: SID=31d4d96e407aad42

指定Cookie的Path和Domain屬性

==Server -> User Agent ==
Set-Cookie: SID=31d4d96e407aad42; Path=/; Domain=example.com
==User Agent -> Server ==
Cookie: SID=31d4d96e407aad42

包含多個Cookie,一個名字是SID,另一個名字lang,名爲SID的Cookie指定了Path,Secure和HttpOnly屬性;名爲lang的Cookie指定了Path和Domain屬性:

==Server -> User Agent ==
Set-Cookie: SID=31d4d96e407aad42; Path=/; Secure; HttpOnly
Set-Cookie: lang=en-US; Path=/; Domain=example.com
==User Agent -> Server ==
Cookie: SID=31d4d96e407aad42; lang=en-US

指定名爲lang的Cookie的過期時間:

==Server -> User Agent ==
Set-Cookie: lang=en-US; Expires=Wed, 09 Jun 2021 10:18:14 GMT
==User Agent -> Server ==
Cookie: SID=31d4d96e407aad42; lang=en-US

服務器通過給名爲lang的Cookie指定一個過去的時間來刪除該

Cookie:
==Server -> User Agent ==
Set-Cookie: lang=; Expires=Sun, 06 Nov 1994 08:49:37 GMT
== User Agent -> Server ==【客戶端發給服務器的Cookie不再包含lang】
Cookie: SID=31d4d96e407aad42

Third-Party Cookies
如果用戶訪問某個網頁,該網頁嵌入了三方廣告,打開網頁的時候會向廣告服務區發送請求,廣告服務器返回的Response裏會返回一個Cookie,下次用戶打開其他網頁的時候,如果該網頁嵌入了同一個第三方廣告平臺,那請求廣告內容的Request裏會自動把之前返回的Cookie添加進去,從而能讓廣告服務器識別出該用戶,根據之前瀏覽的內容給用戶推薦相應的廣告。這就是爲什麼能給用戶展示之前訪問內容相關的廣告。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章