目錄
HTTP報文是由 header+body 組成,請求頭里有請求方法和請求目標,響應頭里有狀態碼和原因短語,本節學習的是請求頭里的請求方法。
標准請求方法
- 請求方法的實際含義:客戶端發送一個“動作指令”,要求服務器對URI定位的資源執行這個動作。
- 目前 HTTP/1.1 規定了八種方法,單詞必須是大寫形式。
- 請求方法只是客戶端的指令,客戶端沒有決定權,服務端掌控所有資源,才有絕對的決策權力。
舉例:客戶端發起一個 GET 請求,想獲取 “/orders” 這個文件,但是文件級別較高,那么服務器可以有如下幾種響應方式:- 假裝文件不存在,直接返回 404 Not found 報文;
- 稍微友好一點,明確告訴你有這個文件,但是不允許訪問,返回一個 403 Forbidden;
- 再寬松一些,返回 405 Method Not Allowed,然后用 Allow 頭告訴你可以用 HEAD 方法獲取文件的元信息。
GET/HEAD
GET 方法
- 從 0.9 版出現一直保留至今。
- 含義是:請求從服務器獲取資源,這個資源即可以是靜態的文本,頁面,圖片,視頻,也可以是由PHP、Java 動態生成的頁面或者其他格式的數據。
- GET 方法可以搭配其他字段實現對資源更精細的操作:
- URI 后使用 # ,在獲取頁面后直接定位到某個標簽所在的位置
- 使用 If-Modified-Since 字段,編程有條件的請求,僅當資源被修改時才會執行獲取動作
- 使用 Range 字段就是“范圍請求”,只獲取資源的一部分數據
HEAD方法
- 請求從服務器獲取資源,但是只傳回響應頭,即資源的“元信息”。
- HEAD 方法可以看作GET方法的一個簡化版或輕量版,用在並不需要資源的場合,避免傳輸body數據的浪費。
POST/PUT
POST/PUT向 URI 指定的資源提交數據,數據就放在報文的body里
POST
- 使用頻率高,應用場景多,只要向服務器發送數據,大多數都是POST。
- POST表示 “新建”“create”含義
PUT
- 使用頻率低,和 POST 語義類似。
- PUT 表示 “修改”“update”含義。
非常用方法
應用的不是很多
DELETE 方法
- 指示服務器刪除資源,因為這個動作危險性太大,所以通常服務器不會執行真正的刪除操作,而是對資源做一個刪除標記。
- 更多的時候服務器就直接不處理 DELETE 請求。
CONNECT 方法
- 是一個比較特殊的方法,要求服務器為客戶端和另一台遠程服務器建立一條特殊的連接隧道,這時 Web 服務器在中間充當了代理的角色。
OPTIONS 方法
- 要求服務器列出可對資源實行的操作方法,在響應頭的 Allow 字段里返回。
- 它的功能很有限,用處也不大,有的服務器(例如 Nginx)干脆就沒有實現對它的支持。
TRACE 方法
- 多用於對 HTTP 鏈路的測試或診斷,可以顯示出請求 - 響應的傳輸路徑。
- 它的本意是好的,但存在漏洞,會泄漏網站的信息,所以 Web 服務器通常也是禁止使用。
拓展方法
比如用 LOCK 方法鎖定資源暫時不允許修改,或者使用 PATCH 方法給資源打個小補丁,部分更新數據。
但因為這些方法是非標准的,所以需要為客戶端和服務器編寫額外的代碼才能添加支持。
安全和冪等
安全
在HTTP 協議里,安全是指 請求方法不會破壞服務器上的資源,即不會對服務器上的資源造成實質的修改。
GET、HEAD 方法是“安全”的,因為它們是“只讀”操作,只要服務器不故意曲解請求方法的處理方式,無論GET和HEAD操作多少次,服務器上的數據都是“安全”的。
POST、PUT、DELETE 方法會修改服務器上的資源,增加或刪除數據,所以是“不安全”的。
冪等
冪等是數學的用語,被借用到 HTTP 協議里,意思是多次執行相同的操作,結果也是相同的。
- GET、HEAD 是冪等的。
- DELET 可以多次刪除同一個資源,效果都是“資源不存在”,所以也是冪等的。
- POST 是“新增或提交數據”,多次提交數據會創建多個資源,所以不是冪等的。
- PUT 是“替換或更新數據”,多次更新一個資源,資源還是保持第一次更新的狀態,所以是冪等的。