作為一個開發人員,你需要了解的一些HTTP基礎知識

weixin_33860722發表於2017-08-01

日常開發過程中,經常會使用到http報文傳遞,今天就來說一說http的一些基礎知識。

首先來看下wiki百科的定義

超文字傳輸協定(英文:HyperText Transfer Protocol,縮寫:HTTP)是一種用於分散式、協作式和超媒體資訊系統的應用層協議。 HTTP是全球資訊網的資料通訊的基礎。

HTTP思維導圖

這裡提供一張HTTP報文組成的思維導圖,下面會圍繞這張圖來展開講解內容。

1158807-1f9f0ea962a3597c.png
HTTP報文導圖

HTTP版本

超文字傳輸協議已經演化出了很多版本,它們中的大部分都是向下相容的。在 RFC 2145 中描述了HTTP版本號的用法。客戶端在請求的開始告訴伺服器它採用的協議版本號,而後者則在響應中採用相同或者更早的協議版本。現行常用版本是在1999年提出的1.1版本,以下所說的內容都是基於1.1版本來展開的。

HTTP報文組成 —— 行(Line)

請求行

請求行包含HTTP版本、協議、請求路徑、請求方法幾部分資訊。

  • 首先來說下請求路徑:


    1158807-4ebfbe70dc7fa2dd.png
    請求路徑
    • 協議(Protocol):常用協議一般有http和https兩種;
    • 主機(Host):主機域名;
    • 路徑(Path):域名子路徑
    • 引數(Query String):請求引數

    請求路徑由以上幾個部分組成,其中協議和主機是必須項,用來區分不同地址,路徑和引數可以根據需要或有或無。譬如“http://www.baidu.com” 是沒有路徑和引數的,直接指向百度的搜尋主頁,然而在搜尋結果頁,就會有路徑和引數。

請求方法

1158807-bed4afab922a44d7.png
請求方法

在http1.1版本中,收錄了八種請求方法,在開發中常用的有四種。

PUT:增
DELETE:刪
POST:改
GET:查

tips:在這裡需要引入一個概念,冪等。**

一個方法重複執行多次,產生的效果是一樣的,那就是冪等(idempotent)的。反之,非冪等

在上面四種請求方法中,PUT是冪等的,POST是非冪等的。
在這裡再引入一個思考,你們公司的介面,更新資料是用PUT還是POST來做的?

狀態行

狀態行是用來表示請求響應的返回狀態
1xx:指示資訊——表示請求已經接受,繼續處理中
2xx:成功——表示請求已經被成功接收、理解、接受
3xx:重定向——要完成請求必須進行更進一步的操作
4xx/客戶端錯誤——請求有語法錯誤或請求無法實現
5xx/伺服器端錯誤——伺服器未能實現合法的請求

知道了這些狀態碼分類,就可以根據不同的狀態碼,分析請求失敗的大致原因出在哪一方,可以更快的定位問題。

HTTP報文組成 —— 頭(Head)

HTTP的請求和相應都會包含首部,首部中會包含一些請求或響應的額外重要資訊,例如物件型別(content-type),保持連線(keep-Alive)等。

cookie

因為http是無狀態協議,它不對之前發生過的請求和響應的狀態進行管理。也就是說無法根據之前的狀態進行本次的請求處理。

在請求和響應中寫入cookie資訊來控制客戶端的狀態,作為記錄客戶端的狀態位

通用首部

1158807-735d225c497a98fc.png
通用首部

請求首部

1158807-4f6c78a6fc3f321a.png
請求首部

響應首部

1158807-8ed5ce6d9fb108d3.png
響應首部

實體首部

1158807-e6dce7dbb5dc48aa.png
實體首部

HTTP報文組成 —— 體(Body)

體分為請求體和響應體,根據首部的content-type又可以分為單個整體和多部分組成。
在請求中,有一些請求方法是沒有請求體的,例如GET、DELETE等,這些沒有請求體的方法,所有的引數都作為QueryString引數,儲存在請求路徑中。在1.1版本中,只有POST和PUT是有請求體的。

content-type

單個整體

  • text/plain 純文字
  • application/json 通用且符合標準
  • text/json 相容IE6
  • text/html

多部分組成(表單上傳)
multipart /form-data

POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA

------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"

title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png

PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

結語

文章中的內容,可能更偏重於行的講解,對於首部和體部沒有更深層次的介紹。有興趣的話,也可以自己再深入研究下。在這裡推薦兩個關於HTTP的書,一本是《圖解HTTP(上野宣 著 於均良 譯)》,這個書講解的比較淺顯易懂,更容易理解。另一本是HTTP界的權威《HTTP權威指南》,這個書內容更多更全面,想深入學習的可以看一看這本。最後,附上一下《圖解HTTP》 (提取密碼: 8jyg)的PDF版吧,希望有興趣的可以去看一看。

感謝

文章作為學習階段的總結,會存在許多不足之處,如有講解錯誤之處,希望可以及時指出,及時更正。如果從文章中你獲得了新的知識,得到了新的總結,那這篇胡言亂語,就算是有一絲存在的意義吧。

引用

get、put、post、delete含義與區別 - - 十五言

HTTP協議中PUT和POST使用區別 - 其實並不難,是你太悲觀 - 部落格頻道 - CSDN.NET

四種常見的 POST 提交資料方式 | JerryQu 的小站

你應該知道的HTTP基礎知識 - 簡書

字元編碼筆記:ASCII,Unicode 和 UTF-8

相關文章