應用層與 HTTP

HTTP 請求方法(request methods)

當你的瀏覽器送出一則 HTTP 請求時,最前面的那個字說的是你想「做什麼」,而不只是你想要「什麼」。那個字就是請求方法(request method)。它是句子的動詞:URL 命名一個事物(名詞),方法則說明動作。「GET /photos/cat.jpg」意思是「把那張貓的照片給我」;「DELETE /photos/cat.jpg」意思是「把那張貓的照片刪掉」。同一個資源、相反的意圖,完全靠方法來區分。

你最常遇到的四個各有明確的任務。GET 取回一項資源,且不應改變伺服器上的任何東西——它本意是純粹的讀取。POST 把資料送給伺服器以建立某物或觸發某動作,例如送出一張表單或張貼一則留言;它是「拿這份資料去做點什麼」的預設選擇。PUT 把你送去的資料放到、或取代掉某個已知位置上的資源。DELETE 移除指名的那項資源。有兩個性質很重要:GET、PUT、DELETE 本意是冪等(idempotent)的——做一次或做十次,最終狀態都一樣——而 POST 通常不是,這就是為什麼瀏覽器在重送一個 POST 前會跳出警告。

這些方法是一份共同的約定,而非魔法。伺服器有權自行詮釋它們,但守規矩的網路服務會遵循這些慣例,因為整個生態系(快取、代理伺服器、搜尋引擎爬蟲)都仰賴它們。爬蟲會放心地發出 GET 請求,因為 GET 承諾不會改變任何東西;但它絕不會發出 DELETE。這也是 REST API 的骨幹,在那裡 GET/POST/PUT/DELETE 乾淨地對應到對資料的讀取/建立/更新/移除操作。

以一個待辦事項 App 為例:GET /tasks 列出你的任務;帶著主體的 POST /tasks 新增一筆;PUT /tasks/7 取代第 7 號任務;DELETE /tasks/7 把它刪掉。你想重新整理頁面(GET)幾次都行——什麼都不會變。但若重送那個 POST,你可能會多建出一筆重複的任務,這正是為什麼要把 GET 和 POST 分得清清楚楚。

方法就是動詞:同一個 URL,由方法決定你是讀取、建立、取代還是刪除。

「GET 是安全的」是協定對「意圖」所作的承諾,並非被強制執行的保證。一台設計拙劣的伺服器有可能在 GET 時改動資料——而那是個真正的臭蟲,因為爬蟲與預先抓取程式會在你意想不到時觸發它。

又稱
HTTP verbs請求方法HTTP 動詞