1. 程式人生 > 其它 >http學習 http的請求方法

http學習 http的請求方法

http的標準請求方法

HTTP 協議裡為什麼要有“請求方法”這個東西呢?

這就要從 HTTP 協議設計時的定位說起了。還記得嗎?蒂姆·伯納斯 - 李最初設想的是要用 HTTP 協議構建一個超連結文件系統,使用 URI 來定位這些文件,也就是資源。那麼,該怎麼在協議裡操作這些資源呢?

很顯然,需要有某種“動作的指示”,告訴操作這些資源的方式。所以,就這麼出現了“請求方法”。它的實際含義就是客戶端發出了一個“動作指令”,要求伺服器端對 URI 定位的資源執行這個動作

目前 HTTP/1.1 規定了八種方法,單詞都必須是大寫的形式:

  • GET:獲取資源,可以理解為讀取或者下載資料;
  • HEAD:獲取資源的元資訊;
  • POST:向資源提交資料,相當於寫入或上傳資料;
  • PUT:類似 POST;
  • DELETE:刪除資源;
  • CONNECT:建立特殊的連線隧道;
  • OPTIONS:列出可對資源實行的方法;
  • TRACE:追蹤請求 - 響應的傳輸路徑。

GET/HEAD

  • GET

GET的含義是請求從伺服器獲取資源,這個資源既可以是靜態的文字、頁面、圖片、視訊,也可以是由 PHP、Java 動態生成的頁面或者其他格式的資料

GET 方法雖然基本動作比較簡單,但搭配 URI 和其他頭欄位就能實現對資源更精細的操作。例如,在 URI 後使用“#”,就可以在獲取頁面後直接定位到某個標籤所在的位置;使用 If-Modified-Since 欄位就變成了“有條件的請求”,僅當資源被修改時才會執行獲取動作;使用 Range 欄位就是“範圍請求”,只獲取資源的一部分資料。

  • HEAD

HEAD 方法與 GET 方法類似,也是請求從伺服器獲取資源,伺服器的處理機制也是一樣的,但伺服器不會返回請求的實體資料,只會傳回響應頭,也就是資源的“元資訊”。

因為它的響應頭與 GET 完全相同,所以可以用在很多並不真正需要資源的場合,避免傳輸 body 資料的浪費。比如,想要檢查一個檔案是否存在,只要發個 HEAD 請求就可以了,沒有必要用 GET 把整個檔案都取下來。再比如,要檢查檔案是否有最新版本,同樣也應該用 HEAD,伺服器會在響應頭裡把檔案的修改時間傳回來。

POST/PUT

GET 和 HEAD 方法是從伺服器獲取資料,而 POST 和 PUT 方法則是相反操作,向 URI 指定的資源提交資料,資料就放在報文的 body 裡。

  • POST

要向伺服器傳送資料,用的大多數都是 POST。

  • PUT

PUT 的作用與 POST 類似,也可以向伺服器提交資料,但與 POST 存在微妙的不同,通常 POST 表示的是“新建”“create”的含義,而 PUT 則是“修改”“update”的含義。

在實際應用中,PUT 用到的比較少。而且,因為它與 POST 的語義、功能太過近似,有的伺服器甚至就直接禁止使用 PUT 方法,只用 POST 方法上傳資料。

其他方法

除了 GET/HEAD/POST/PUT,還剩下四個標準請求方法,它們屬於比較“冷僻”的方法,應用的不是很多。

  • DELETE

    指示伺服器刪除資源,因為這個動作危險性太大,所以通常伺服器不會執行真正的刪除操作,而是對資源做一個刪除標記。當然,更多的時候伺服器就直接不處理 DELETE 請求。

  • CONNECT

    一個比較特殊的方法,要求伺服器為客戶端和另一臺遠端伺服器建立一條特殊的連線隧道,這時 Web 伺服器在中間充當了代理的角色。

  • OPTIONS

    要求伺服器列出可對資源實行的操作方法,在響應頭的 Allow 欄位裡返回。它的功能很有限,用處也不大,有的伺服器(例如 Nginx)乾脆就沒有實現對它的支援。

  • TRACE

    多用於對 HTTP 鏈路的測試或診斷,可以顯示出請求 - 響應的傳輸路徑。它的本意是好的,但存在漏洞,會洩漏網站的資訊,所以 Web 伺服器通常也是禁止使用。

擴充套件方法

雖然 HTTP/1.1 裡規定了八種請求方法,但它並沒有限制我們只能用這八種方法,這也體現了 HTTP 協議良好的擴充套件性,我們可以任意新增請求動作,只要請求方和響應方都能理解就行。

MKCOL、COPY、MOVE、LOCK、UNLOCK、PATCH 等。如果有合適的場景,你也可以把它們應用到自己的系統裡,

比如用 LOCK 方法鎖定資源暫時不允許修改,或者使用 PATCH 方法給資源打個小補丁,部分更新資料。但因為這些方法是非標準的,所以需要為客戶端和伺服器編寫額外的程式碼才能新增支援。

安全與冪等

  • 安全

    在 HTTP 協議裡,所謂的“安全”是指請求方法不會“破壞”伺服器上的資源,即不會對伺服器上的資源造成實質的修改。

      • GET、HEAD是安全的,因為只讀
      • POST/PUT/DELETE 操作會修改伺服器上的資源,增加或刪除資料,是“不安全”的。
  • 冪等

    “冪等”實際上是一個數學用語,被借用到了 HTTP 協議裡,意思是多次執行相同的操作,結果也都是相同的,即多次“冪”後結果“相等”。

      • GET 和 HEAD 既是安全的也是冪等的,DELETE 可以多次刪除同一個資源,效果都是“資源不存在”,所以也是冪等的。
      • POST 是“新增或提交資料”,多次提交資料會建立多個資源,所以不是冪等的
      • 而 PUT 是“替換或更新資料”,多次更新一個資源,資源還是會第一次更新的狀態,所以是冪等的。

小結

  1. 請求方法是客戶端發出的、要求伺服器執行的、對資源的一種操作;
  2. 請求方法是對伺服器的“指示”,真正應如何處理由伺服器來決定;
  3. 最常用的請求方法是 GET 和 POST,分別是獲取資料和傳送資料;
  4. HEAD 方法是輕量級的 GET,用來獲取資源的元資訊;
  5. PUT 基本上是 POST 的同義詞,多用於更新資料;
  6. “安全”與“冪等”是描述請求方法的兩個重要屬性,具有理論指導意義,可以幫助我們設計系統。