網際網路筆記:HTTP method
原本以為離開 web application 後就不會再碰到他們,完全忘了只要有 HTTP/HTTPS 協定的地方就有它,而 HTTP 協定的應用範圍也不僅限於網站,像是 APP、redfish、NAS、智慧家庭設備、DASH、部分印表機……等等地方,都有 HTTP 協定的身影。當然,前面只是列出部分應用情境,HTTP 協定的應用範圍遠比我提的多得多。
什麼是 HTTP method?
這個問題大部分的工程師可能會脫口說出「GET」、「POST」,但用文字定義比較難,簡單來說就是——我這次的請求想對這個資源做什麼事?
在網站工程師經常使用的 Postman 中我們經常看到這些 HTTP method。
下面會接著講述九種 HTTP method,以及一些自問自答(像是前端或快速開發者會有的疑惑——明明 API 用 GET、POST 就能完成全部功能,為什麼還有其他方法?)。
請求方法
GET:用來「取得」資料
POST
用來建立新的資源,或觸發需要處理的操作,常見於表單提交、登入、建立資料
重複發送的話,會產生多份資料
request body 通常有兩種格式:application/x-www-form-urlencoded:傳輸簡單資料
multipart/form-data:傳檔案
PUT:更新整個資源,通常要一次提供完整資料;重複發送的結果相同
PATCH:局部更新資源
DELETE:刪除資源
HEAD:只要 header,不要 body;通常用於測試與檢查
OPTIONS:詢問伺服器支援哪些 method,常用於 CORS 預檢(註一)
TRACE:回傳 sever 收到的請求,主要用於 debug
CONNECT:與請求的資源建立雙向通訊
這些方法名稱有分大小寫,如果不是全大寫的話,伺服器會直接回 501。
下面放上一張我覺得很棒的屬性對照表(註二):
(圖片 reference)
表格中的「冪等的」指的是 Idempotent,我自己的理解是「重複呼叫是否會改變結果」。
註一,CORS 預檢:瀏覽器在發送某些跨網域請求之前,先發出的一個「試探性」的請求,像瀏覽器問伺服器:欸你允許我這樣做嗎?
明明 API 用 GET、POST 就能完成全部功能,為什麼還有其他方法?
許多人接觸到 HTTP method 是因為網站開發,不論是前端、後端,幾乎只會使用 GET 和 POST,PUT、PATCH、DELETE 這些基本沒看過。這是因為 HTTP 本身並沒有強制一定要用 PUT/PATCH/DELETE 來更新或刪除資料,從技術上來說,用 GET + POST 打天下,完全可以。
於是我們把 URI 寫成了這樣:
POST /user/update
POST /user/delete
POST /user/modifyField
尤其早期網站環境,因為下面幾個因素:
- 部分 HTML form 只能送 GET / POST
- 最初的後端框架設計也把 POST 當萬用動詞
- 某些企業環境或設備不允許 PUT/DELETE,那乾脆全用 POST 最簡單
導致了現在許多網站、甚至是相關從業工程師還是 GET + POST 打天下的局面。
經過上面請求方法的章節、以及表格比較,我們可以知道,使用 POST 取代 PUT、PATCH、DELETE 等方法,我們會不能被快取、重複傳送會出現好幾份,最重要的是,失去了語意表達的功能。
總而言之,正常的用法應該是有什麼需求用哪個 method,但因為網站的環境特殊性,才導致用 POST 取代其他方法的局面。
留言
張貼留言