紀錄工作經驗、相關知識,解決技術相關問題。

HTML, 工作雜談, 新手 Jamp Holes, 網站相關, 資訊相關

淺談 HTTP 請求方法 (HTTP Request Methods):GET、POST、PUT、DELETE 基礎概念與 Fetch 入門

淺談 HTTP 請求方法 (HTTP Request Methods):GET、POST、PUT、DELETE 基礎概念與 Fetch 入門 特色圖片

HTTP 請求方法(HTTP Request Methods,常稱為 HTTP 動詞)是瀏覽器(客戶端)與網站伺服器溝通時用來表達「操作意圖」的標準指令。無論是打開網頁讀取文章、送出註冊表單、修改個人資料或刪除留言,背後都是透過 GET、POST、PUT、PATCH、DELETE 等不同的請求方法來告訴伺服器該執行哪種動作。

本篇專為剛接觸網頁開發與前後端串接的初學者編寫,帶你從零認識 7 種標準 HTTP 請求方法與基礎 JavaScript fetch() 呼叫語法。若您已經熟悉基本語法,想進一步了解各方法的優缺點比較、冪等性(Idempotency)、PUT 與 PATCH 選型差異及 CORS 預檢排錯,可直接前往進階延伸篇:RESTful API 請求方法怎麼選?HTTP 各方法優缺點比較、冪等性與串接避坑要點。


一、什麼是 HTTP 與請求方法(HTTP Request Methods)?

HTTP 的英文全名為 HyperText Transfer Protocol(超文本傳輸協定),是全球網際網路上傳輸網頁內容與 API 資料的基礎通訊協定。

在網頁運作的過程中,溝通永遠是由客戶端(例如使用者的 Chrome 瀏覽器或手機 App)主動發起:

  1. 發送請求(Request):客戶端向伺服器指定一個網址(URL),並附上一個「HTTP 請求方法」,表明這次連線是要「拿資料」還是「改資料」。
  2. 回傳回應(Response):伺服器收到請求並處理完畢後,回傳對應的資料內容(如 HTML 網頁或 JSON 資料)以及 HTTP 狀態碼(如 200 OK 代表成功)。

如果沒有區分請求方法,伺服器看到一個連往 /users/1 的請求時,將無法分辨你是想「查詢」這位使用者的資料,還是想把他從資料庫中「刪除」。


二、7 大常用 HTTP 請求方法與 CRUD 對應速查表

在開發網站與串接 API(詳見 API 是什麼)時,最常遇到的就是資料庫的「新增(Create)、讀取(Read)、更新(Update)、刪除(Delete)」四大基礎操作(簡稱 CRUD)。以下整理 7 種標準 HTTP 請求方法的功能與對應關係:

HTTP 請求方法對應 CRUD 操作核心功能描述是否常帶 Request Body
GETRead(讀取)向伺服器請求讀取指定網址的資源或資料列表否(參數帶於 URL 查詢字串)
POSTCreate(新增)向伺服器提交新資料(如建立新會員、送出訂單、上傳檔案)是(封裝於請求主體 Body)
PUTUpdate(全量更新)以新傳送的完整資料,整筆覆蓋替換目標資源的所有欄位是(傳送完整資源欄位)
PATCHUpdate(部分更新)僅針對目標資源的部分欄位進行局部修改(如只改信箱或狀態)是(僅傳送欲修改的欄位)
DELETEDelete(刪除)請求伺服器刪除指定網址對應的資源否(通常由 URL 指定 ID)
HEAD檢查標頭與 GET 相同,但伺服器只回傳回應標頭(Headers)、不回傳內容本體否
OPTIONS查詢通訊選項詢問伺服器該網址支援哪些 HTTP 方法與跨來源(CORS)權限否

三、四大核心請求方法基礎語法範例(JavaScript fetch)

在現代前端開發中,瀏覽器原生內建的 fetch() 是發送 HTTP 請求最標準的工具(若不特別指定 method 參數,fetch() 預設會發送 GET 請求)。以下示範最基礎的四種資料操作寫法:

1. GET 請求:讀取與查詢資源

當你在瀏覽器輸入網址、搜尋關鍵字或載入商品列表時,發送的都是 GET 請求。它是純粹的「唯讀」操作,不應修改伺服器上的資料,且查詢條件通常直接接在網址問號 ? 後方(Query String):

// 向伺服器查詢 id 為 1 的使用者資料
fetch('https://api.example.com/users?id=1', {
  method: 'GET',
  headers: {
    'Accept': 'application/json'
  }
})
  .then(response => response.json())
  .then(data => console.log('讀取成功:', data))
  .catch(error => console.error('請求發生錯誤:', error));

2. POST 請求:新增資源或提交表單資料

當使用者填完註冊表單、發表新文章或上傳檔案時,會使用 POST 請求。與 GET 不同,POST 會將要傳送的資料放在請求主體(Request Body)中,不會直接暴露在網址列上:

// 新增一筆使用者資料
fetch('https://api.example.com/users', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    name: 'Sean',
    email: '[email protected]'
  })
})
  .then(response => response.json())
  .then(data => console.log('新增成功:', data))
  .catch(error => console.error('新增失敗:', error));

3. PUT 與 PATCH 請求:更新既有資源

當需要修改伺服器上已經存在的資料(例如編輯編號 1 的會員資料 /users/1)時,會依更新範圍選擇 PUT 或 PATCH:

  • PUT:傳送整筆完整的物件資料,將原本的資料整筆替換。
  • PATCH:只傳送有變動的那一個欄位(例如只修改 email)。
// 使用 PATCH 局部更新編號 1 使用者的信箱
fetch('https://api.example.com/users/1', {
  method: 'PATCH',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    email: '[email protected]'
  })
})
  .then(response => response.json())
  .then(data => console.log('更新成功:', data))
  .catch(error => console.error('更新失敗:', error));

4. DELETE 請求:刪除指定資源

當需要移除特定資料(例如刪除編號 1 的文章或移除購物車項目)時,透過網址指定目標 ID 並發送 DELETE 請求:

// 刪除編號 1 的使用者資源
fetch('https://api.example.com/users/1', {
  method: 'DELETE'
})
  .then(response => {
    if (response.ok) {
      console.log('資源已成功刪除');
    }
  })
  .catch(error => console.error('刪除失敗:', error));

四、輔助型請求方法:HEAD 與 OPTIONS 是做什麼的?

除了負責資料增刪改查的五種方法外,還有兩個常在瀏覽器背景運作的輔助方法:

1. HEAD 方法:只看標頭資訊、不下載檔案內容

HEAD 請求的格式與 GET 完全一樣,唯一的差別在於:伺服器只會回傳 HTTP 標頭(Headers),不會回傳網頁或檔案的內容本體(Body)。

  • 常見用途:在下載一個數 GB 的大型壓縮檔或影片前,先發送 HEAD 請求讀取標頭中的 Content-Length(檔案大小)或 Last-Modified(最後修改時間),確認連結存活且檔案有更新後,才真正發起 GET 下載,能大幅節省網路頻寬。

2. OPTIONS 方法:查詢伺服器支援的通訊選項

OPTIONS 用於向伺服器詢問:「這個網址允許使用哪些 HTTP 方法?是否允許跨網域存取?」

  • 常見用途:當前端網頁從 https://a.com 呼叫 https://api.b.com 的非簡單請求(例如使用 PUT、DELETE 或自訂 Authorization 標頭)時,瀏覽器會自動先發送一個 OPTIONS 預檢請求(Preflight Request),確認伺服器回傳許可標頭後,才會送出真正的請求。

五、新手常見問題(Q&A)

Q1:在瀏覽器網址列直接輸入網址按下 Enter,發送的是哪一種 HTTP 請求?

固定發送的是 GET 請求。 瀏覽器網址列與網頁上的 <a> 超連結,天生只會向伺服器發起讀取用途的 GET 請求;若要發送 POST、PUT 或 DELETE,必須透過 HTML <form> 表單或 JavaScript(如 fetch)來觸發。

Q2:HTML 原生 form 表單跟 JavaScript fetch() 支援的請求方法一樣嗎?

不一樣。 HTML 原生 <form method="..."> 標籤的 method 屬性,在標準規範中只支援 GET 與 POST 兩種方法(不含 HTML5 dialog 專用的 dialog),並不直接支援 PUT、PATCH 或 DELETE。想深入了解表單提交的差異,可參考站內專文:HTML Form GET 與 POST 差異比較與常見使用場景解析。

Q3:學會了基礎語法後,實際設計 API 時該怎麼決定何時用 PUT、何時用 PATCH?

這涉及 RESTful API 的「優缺點權衡」與「冪等性(Idempotency)」設計。我們在系列下一篇整理了完整的對照表與排錯案例,歡迎接著閱讀:RESTful API 請求方法怎麼選?HTTP 各方法優缺點比較、冪等性與串接避坑要點。


總結

掌握 HTTP 請求方法 是進入網站前後端開發的第一步:

  1. 查詢資料用 GET(參數在 URL、純唯讀)。
  2. 新增資料與送表單用 POST(資料放在 Request Body)。
  3. 修改資料用 PUT(整筆覆蓋)或 PATCH(局部修改)。
  4. 移除資料用 DELETE,而檢查檔案標頭與跨域權限則分別由 HEAD 與 OPTIONS 負責。

參考資料與延伸閱讀

發佈留言