初學者指南:什麼是 HTTP 方法?

Published October 31, 2024 by 徐培鈞
基礎概念

當你在瀏覽網頁或與網站互動時,你的瀏覽器和伺服器之間其實正在進行大量的通訊。

而這些通訊,是通過一種叫做 HTTP 方法(HTTP Methods) 的操作來完成的。

HTTP 方法是指,瀏覽器用來告訴伺服器,我們想要進行什麼操作的一組標準化命令。

這篇文章將幫助你,了解最常見的 HTTP 方法,並說明它們的作用和用途。

什麼是 HTTP 方法?

HTTP(Hypertext Transfer Protocol) ,是用於在客戶端(例如你的瀏覽器)和伺服器之間傳輸資料的協議。

而 HTTP 方法,則用於指示伺服器應該如何處理特定的資源。

例如,當你在瀏覽器中輸入一個網址並按下 Enter,瀏覽器會發送一個 HTTP 請求到伺服器,請求對應頁面的資料。

HTTP 方法可以幫助定義這些請求的操作類型,以下是一些最常見的 HTTP 方法:

GET 方法

GET 是最常用的 HTTP 方法之一,主要用於從伺服器中獲取資源或資料。

當你在瀏覽器中輸入一個網址並請求網頁時,其實就是在使用 GET 方法。

  • 用途:請求並獲取伺服器上的資料。
  • 特點:GET 請求的參數會顯示在 URL 中,因此不適合傳輸敏感資訊。

範例:

GET /products HTTP/1.1
Host: example.com

這個請求會向伺服器請求所有商品的資料。

POST 方法

POST 用於將新的資料提交到伺服器,例如提交表單、上傳檔案等。

POST 方法的請求資料會包含在請求體中,而不是顯示在 URL 中。

  • 用途:提交新的資料或創建資源。
  • 特點:通常用於提交表單、創建帳戶等操作,資料不會顯示在 URL 中,安全性相對較高。

範例:

POST /products HTTP/1.1
Host: example.com
Content-Type: application/json

{
  "name": "新商品",
  "price": 100
}

這個請求會向伺服器提交一個新商品的資料。

PUT 方法

PUT 用於更新伺服器上的現有資源或創建資源。

如果資源不存在,伺服器通常會創建一個新的資源。

PUT 方法比較常用於整體更新資源的情況。

  • 用途:更新或替換伺服器上的資源。
  • 特點:請求通常包含完整的資源資訊,適合替換現有的資料。

範例:

PUT /products/1 HTTP/1.1
Host: example.com
Content-Type: application/json

{
  "name": "更新後的商品",
  "price": 150
}

這個請求會更新商品 ID 為 1 的資訊。

PATCH 方法

PATCH 也用於更新資源,但與 PUT 不同的是,PATCH 只會更新資源的部分內容,而不是整體替換。

因此,當你只需要修改資源的某個字段時,使用 PATCH 更為合適。

  • 用途:部分更新資源。
  • 特點:只需包含需要修改的部分,不用傳整個資源。

範例:

PATCH /products/1 HTTP/1.1
Host: example.com
Content-Type: application/json

{
  "price": 120
}

這個請求會僅更新商品 ID 為 1 的價格資訊。

DELETE 方法

DELETE 用於刪除伺服器上的資源。

例如,如果你想刪除某個資料記錄或文件,可以使用 DELETE 方法。

  • 用途:刪除伺服器上的資源。
  • 特點:直接刪除指定的資源,通常不會有請求體。

範例:

DELETE /products/1 HTTP/1.1
Host: example.com

這個請求會刪除商品 ID 為 1 的資料。

常見應用場景

不同的 HTTP 方法適用於不同的場景,以下是一些常見的應用場景:

  1. GET:當你想要從伺服器獲取資料,例如查詢所有使用者的列表。
  2. POST:當你需要創建一個新的使用者帳戶時,使用 POST 方法提交表單資料。
  3. PUT:如果你需要替換現有的使用者資料,可以使用 PUT 方法。
  4. PATCH:如果你只需要修改使用者的部分資訊,例如更改 email,則使用 PATCH 方法更為高效。
  5. DELETE:當你想要移除某個使用者的帳戶時,可以使用 DELETE 方法。

關於 GET 與 POST,你可能誤會的事

初學者常常會有一個疑問:

既然 GET 是「取得」資料,POST 是「送出」資料,那 GET 是不是不能帶任何資料給伺服器?

其實不是的。

GET 也可以攜帶資料,只是資料必須放在 URL 的 Query 參數 中。

範例:

GET /products?category=electronics&sort=price HTTP/1.1
Host: example.com

在這個例子中,category=electronicssort=price 就是透過 GET 請求傳送給伺服器的資料。

那我可以用 GET 來新增資料嗎?

技術上,可以

這是因為 HTTP 方法本身只是一個「標籤」,它告訴伺服器:「嘿,這是一個 GET 請求。」但伺服器收到請求之後,要怎麼處理完全是由後端程式碼決定的

舉個例子,假設有人發送了這樣的請求:

GET /add-product?name=iPhone&price=30000 HTTP/1.1
Host: example.com

後端工程師完全可以這樣寫程式:

// 這是一個「技術上可行,但不應該這樣做」的範例
app.get('/add-product', (req, res) => {
  const name = req.query.name;
  const price = req.query.price;

  // 把資料寫入資料庫
  database.insert({ name, price });

  res.send('商品新增成功');
});

這段程式碼會正常運作,商品確實會被新增到資料庫。

所以問題不在於「能不能做到」,而是「這樣做會帶來什麼問題」。

為什麼不建議用 GET 來新增資料?

雖然技術上做得到,但實務上強烈不建議這麼做,原因如下:

瀏覽器會快取 GET 請求

瀏覽器預設會對 GET 請求進行快取。

這意味著,如果使用者短時間內發送相同的 GET 請求,瀏覽器可能會直接使用快取的回應,根本不會真的把請求送到伺服器。

結果就是:使用者以為資料新增成功了,但其實什麼都沒發生。

網頁爬蟲會自動訪問連結

搜尋引擎的爬蟲(如 Google Bot)會自動抓取網頁上的所有連結。

如果你的「新增商品」功能是一個 GET 連結,爬蟲一爬到就會觸發新增動作。

想像一下:Google 爬蟲每天來你的網站逛一圈,每次都幫你「新增」幾筆假資料,這會是多大的災難。

使用者可能會意外重複觸發

GET 請求的 URL 可以被:

  • 加入書籤
  • 分享給朋友
  • 出現在瀏覽紀錄中
  • 被使用者不小心重新整理

每一次訪問這個 URL,都會執行一次新增。使用者可能只是想回顧一下之前的操作,結果又新增了一筆重複的資料。

違反 HTTP 規範的語意

根據 HTTP 規範,GET 方法被定義為「安全」(Safe)且「冪等」(Idempotent) 的:

  • 安全:這個操作不應該改變伺服器上的資料狀態
  • 冪等:執行一次和執行多次的結果應該相同

新增資料明顯違反了這兩個原則。雖然伺服器不會阻止你這麼做,但這會讓其他開發者、工具、甚至瀏覽器對你的 API 行為產生錯誤的預期。

敏感資料會暴露在 URL 中

GET 的參數會直接顯示在 URL 上,這意味著:

  • 會出現在瀏覽器的網址列和歷史紀錄
  • 會被記錄在伺服器的 access log
  • 可能被中間的代理伺服器快取或記錄

如果你用 GET 傳送密碼或信用卡號,這些敏感資料就會到處留下痕跡。

GET 跟 POST 的本質差異

那為什麼我們還是說「GET 取得、POST 送出」呢?這其實是指它們的設計目的

  • GET:設計上是用來「請求」資源,附帶的參數通常是查詢或篩選條件。
  • POST:設計上是用來「提交」資料,讓伺服器進行處理。

簡單來說:

GET 帶的資料是為了「告訴伺服器我要找什麼」
POST 帶的資料是為了「告訴伺服器我要它做什麼」

POST 的應用場景

POST 的應用其實很廣泛,不只是「新增一筆資料到資料庫」這麼單純。常見的使用情境包括:

  • 提交表單:註冊帳號、登入、填寫問卷、送出留言
  • 上傳檔案:圖片、文件、影片
  • 觸發動作:發送 Email、產生 PDF 報表、啟動某個背景任務
  • 第三方整合:呼叫金流 API 進行付款、呼叫簡訊 API 發送驗證碼

這些操作的共同點是:你希望伺服器根據你提交的資料「做某件事」,而不只是單純地回傳資料給你。

小結

GETURL 的 Query 參數
POST請求的 Body 中
GET請求 / 查詢資源
POST提交資料讓伺服器處理
GET否(Safe)
POST
GET技術上可以,但不建議
POST適合
GET不適合(會暴露在 URL)
POST相對適合

記住:HTTP 方法的選擇不只是技術問題,更是一種約定俗成的語意規範

遵守這些規範,可以讓你的 API 更容易被理解、維護,也能避免許多意想不到的問題。

總結

HTTP 方法是網頁和伺服器之間進行通訊的基本方式,每個方法都有其特定的用途和特點。

最常見的 HTTP 方法包括 GET、POST、PUT、PATCH 和 DELETE,它們分別用於獲取、創建、更新和刪除資源。

理解這些 HTTP 方法,對於掌握 Web 開發和 API 交互至關重要。

希望這篇文章能幫助你,更好地理解 HTTP 方法的基本概念,並為你未來的開發工作,打下堅實的基礎!