HTTP 請求方法指南:GET, POST, PUT, PATCH, DELETE 區別
Web 開發中,開發者每天都在與 API 打交道:用 GET 獲取文章列表,用 POST 創建一個新用户… 但在這些常見操作的背後,每種 HTTP 方法都有其精確的語義和不可替代的場景。理解它們的差異是設計出優雅、可預測的 RESTful 服務的基石。本文將詳細闡述這五種方法的用途、冪等性差異以及它們在實際開發中的應用。
以下是這五種方法的詳細説明和區別:
基本定義
- GET: 用於從服務器檢索信息。GET 請求應該是安全且冪等的,這意味着它只用於獲取數據,不應改變服務器上的資源狀態。 多次相同的 GET 請求應該返回相同的結果。
- POST: 用於向服務器提交數據,通常用於創建新資源。 POST 請求不是冪等的,連續發送相同的 POST 請求會創建多個新資源。
- DELETE: 用於刪除服務器上的指定資源。 DELETE 請求是冪等的,即多次刪除同一個資源的效果與一次刪除相同。
- PUT: 用於創建或完全替換服務器上的資源。 PUT 請求是冪等的,多次發送相同的 PUT 請求將產生相同的結果。
- PATCH: 用於對資源進行部分修改。 PATCH 請求不是冪等的,其效果取決於資源的當前狀態。
核心區別:PUT vs POST
PUT 和 POST 都可以用來創建或更新資源,但它們之間存在關鍵差異:
|
特性
|
PUT
|
POST
|
|
主要用途 |
替換或創建指定 URI 的資源
|
創建一個新資源
|
|
冪等性 |
是冪等的。 多次發送同一個 PUT 請求,服務器上的資源狀態將保持一致。 |
不是冪等的。 多次發送同一個 POST 請求,會創建多個資源。 |
|
URI 的作用 |
URI 直接指向要修改或創建的那個資源。
|
URI 通常指向一個資源集合,服務器會為新創建的資源分配一個新的 URI。
|
|
請求體 |
包含資源的完整表述,用於替換整個資源。
|
包含要創建的新資源的數據。
|
簡單類比:
- PUT: 就像更新一個人的完整個人資料。無論提交多少次更新後的完整資料,這個人的最終資料都是最後一次提交的內容。
- POST: 就像在論壇上發帖子。每提交一次,就會多一個新帖子,即使內容完全一樣。
核心區別:PUT vs PATCH
PUT 和 PATCH 都可以用來更新資源,但更新的方式不同:
|
特性
|
PUT
|
PATCH
|
|
更新方式 |
整體替換。 請求體中需要包含資源的完整數據。如果某個字段沒有在請求中提供,那麼該字段可能會被清空或設為默認值。 |
局部更新。 請求體中只需要包含需要修改的字段。未包含的字段將保持不變。 |
|
效率 |
對於只修改少量信息的場景,發送整個資源數據會比較低效。
|
只傳輸需要修改的數據,更加高效,節省帶寬。
|
|
冪等性 |
是冪等的。 |
不一定是冪等的。 例如,一個 PATCH 請求是“將某個數值加 1”,那麼多次請求的結果就不同。 |
簡單類比:
- PUT: 假設一個用户有姓名和郵箱兩個字段。如果只想更新郵箱,使用 PUT 請求時必須同時提供姓名和新的郵箱。
- PATCH: 在同樣的情況下,使用 PATCH 請求只需要提供新的郵箱地址即可,姓名部分不受影響。
總結表格
|
方法
|
主要操作
|
是否冪等 (Idempotent)
|
是否安全 (Safe)
|
|
GET |
查詢/讀取資源
|
是
|
是
|
|
POST |
創建資源
|
否
|
否
|
|
DELETE |
刪除資源
|
是
|
否
|
|
PUT |
替換/完整更新資源
|
是
|
否
|
|
PATCH |
部分更新資源
|
否
|
否
|
冪等性 (Idempotency): 多次執行相同的操作,其結果與執行一次完全相同。
安全性 (Safety): 操作不會改變服務器上資源的狀態。