《圖解 HTTP》筆記(二)HTTP 協議

1. 請求報文(Request)

客戶端向服務器發起 HTTP 請求,請求的報文結構如下:

GET /index.htm HTTP/1.1
Host: www.baidu.com

一開始的 GET 是請求方法(Request Method),/index.htm 表明要訪問的服務器上的文件,HTTP/1.1 表示 HTTP 的版本號,用來提示服務器客戶端所使用的 HTTP 協議版本。

通過 Chrome 的開發者工具,我們看一個比較復雜的請求。這是百度登錄賬號的請求。

開發者工具截圖

與剛才不一樣的地方是,這一次使用的請求方法(Request Method)是 POST。GET 與 POST 之間的區別有哪些?

網上公認的一些區別有下面這些。(ps:有些區別其實在某種程度上來說算不上區別,看每個人的理解吧。)

  • GET在瀏覽器回退時是無害的,而POST會再次提交請求。
  • GET產生的URL地址可以被Bookmark,而POST不可以。
  • GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。
  • GET請求只能進行url編碼,而POST支持多種編碼方式。
  • GET請求參數會被完整保留在瀏覽器歷史記錄里,而POST中的參數不會被保留。
  • GET請求在URL中傳送的參數是有長度限制的,而POST么有。(URL 長度限制其實是與瀏覽器實現以及操作系統有關的,HTTP 規范中并沒有對 URL 長度做限制。)
  • 對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。
  • GET比POST更不安全,因為參數直接暴露在URL上,所以不能用來傳遞敏感信息。(這里的安全性比較,大家自行判斷吧,有些人可能會認為這兩者所謂的安全性并沒有什么區別。)
  • GET參數通過URL傳遞,POST放在Request body中。

其實在我看來,GET 與 POST 主要的區別還是在“語義”上。在 HTTP 規范中,GET 主要用于信息的獲取,而不會對數據產生影響,不會去增加或修改數據。而 POST 則主要用于向服務器傳輸數據,增加或修改數據。這兩者在語義上存在根本的區別。在 RESTFul (一種后端 Web Service 的接口風格)風格的 API 中,GET 就表示獲取資源,POST 表示新增資源。

2. 響應報文(Response)

響應頭信息
響應主體

3. HTTP 方法

GET:通常用于獲取資源。
POST:向服務器發送數據,主要目的不是用于獲取響應內容。
PUT:傳輸文件(在 RESTful 架構中用于修改資源)。
DELETE:刪除文件。
OPTIONS:詢問支持的方法。
HEAD:獲得響應的頭部,不返回 body。
TRACE:追蹤路徑,讓 Web 服務器端將之前的請求通信環回給客戶端的方法。
CONNECT:要求用隧道協議連接代理(連接代理時使用)

4. 持久連接

當瀏覽一個包含圖片及其他資源的 HTML 頁面時,除了請求 HTML 頁面,還會請求頁面中的其他資源。而每次請求都會產生新的 TCP 連接建立和斷開,這增加了通信量。HTTP/1.1 和 HTTP/1.0(沒有完全標準化)通過持久連接(HTTP Persistent Connections,也稱為 HTTP keep-alive 或 HTTP connection reuse)來解決這一問題。持久連接的特點是,只有在客戶端或服務器其中一方明確提出斷開連接的時候,才會斷開 TCP 連接。

5. 管線化(pipelining)

持久連接為管線化提供了基礎。管線化的意思是,不用等待上一個請求收到響應,就可以發送下一個請求,這樣就可以做到同時并行發送多個請求。

6. Cookie

HTTP 協議是無狀態的,也就是說不對之前發生過的請求和響應信息進行保存及管理,這樣的優點是可以減少服務器的 CPU 和內存資源的消耗。

但是在有些時候,我們卻需要在一定程度上保存客戶端的狀態,例如用戶登錄之后獲取個人信息等,如果沒有一種機制來保存登錄狀態,則需要每次發起 HTTP 請求時帶上用戶認證信息參數(例如用戶名密碼)。

為了解決這個問題,引入了 Cookie 技術,Cookie 通過在請求頭及響應頭中附上信息來保存狀態。服務器可以在響應頭中附上名為 Set-Cookie 的字段,來告知客戶端保存 Cookie(也就是頭部的這段信息)。客戶端每次發起請求的時候,則會自動在請求頭中附帶上保存的 Cookie 信息,服務器端則可以根據客戶端發來的 Cookie 信息來判斷客戶端狀態(例如判斷是否已經登錄,以及登錄的用戶是誰)。單純的 Cookie 模式只在客戶端上保存信息,而不在服務器端保存信息。

7. Session

一種更常見的模式是在服務器上保存信息,也就是 Session 機制。當客戶端向服務器發起請求時,服務器會在內存中為該客戶端創建一塊區域,用來存儲當前客戶端的一些信息,例如登錄狀態已經用戶信息等。并將 Session 對應的 Session Id (類似于鑰匙的概念,通過 session id 可以查找到對應的 session 信息)以 Cookie 的形式發送給客戶端,客戶端就會將 Cookie 保存至本地,每次請求帶上 Cookie,服務器端就可以通過 Cookie 中的 Session Id 來獲取客戶端的狀態。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,993評論 2 374

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,785評論 18 139
  • http協議有http0.9,http1.0,http1.1和http2三個版本,但是現在瀏覽器使用的是htt...
    一現_閱讀 1,880評論 0 3
  • 一、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,409評論 6 152
  • Http協議詳解 標簽(空格分隔): Linux 聲明:本片文章非原創,內容來源于博客園作者MIN飛翔的HTTP協...
    Sivin閱讀 5,244評論 3 82
  • 深入淺出HTTP協議(WEB開發和面試必備) 1.基礎概念篇 a.簡介 HTTP是Hyper Text Trans...
    半世韶華憶闌珊閱讀 1,233評論 0 7