網際網路筆記: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 取代其他方法的局面。

 

 

留言