在 HTTP 協議中,請求方法(也稱為 HTTP 動詞)定義了客戶端希望對指定資源執行的操作類型。這些方法是 HTTP 報文的核心組成部分,決定了請求的目的和行為。
主要 HTTP 請求方法
1. GET
-
用途:獲取資源
-
特點:
- 只讀操作,不應修改服務器狀態
- 數據通過 URL 查詢字符串傳遞(
?key=value
) - 可被緩存、收藏、保留在瀏覽器歷史中
- 有長度限制(約 2048 字符)
-
示例:
GET /products?id=123 HTTP/1.1 Host: example.com
-
響應狀態碼:
- 200 OK(成功)
- 404 Not Found(資源不存在)
- 304 Not Modified(資源未改變)
2. POST
-
用途:創建新資源或提交數據
-
特點:
- 非冪等操作(多次調用產生不同結果)
- 數據通過請求體傳輸(支持多種格式)
- 無長度限制
- 不可緩存
-
示例:
POST /users HTTP/1.1 Host: example.com Content-Type: application/json{"name": "John", "email": "john@example.com"}
-
響應狀態碼:
- 201 Created(資源創建成功)
- 400 Bad Request(請求錯誤)
- 409 Conflict(資源沖突)
3. PUT
-
用途:更新整個資源(全量替換)
-
特點:
- 冪等操作(多次調用效果相同)
- 需要提供資源的完整表示
- 如果資源不存在,可能創建新資源
-
示例:
PUT /users/123 HTTP/1.1 Host: example.com Content-Type: application/json{"name": "John Updated", "email": "john.new@example.com"}
-
響應狀態碼:
- 200 OK(更新成功)
- 204 No Content(更新成功無返回內容)
- 404 Not Found(資源不存在)
4. DELETE
-
用途:刪除指定資源
-
特點:
- 冪等操作
- 通常不需要請求體
-
示例:
DELETE /users/123 HTTP/1.1 Host: example.com
-
響應狀態碼:
- 200 OK(刪除成功)
- 202 Accepted(已接受刪除請求)
- 204 No Content(刪除成功無返回內容)
- 404 Not Found(資源不存在)
5. PATCH
-
用途:部分更新資源
-
特點:
- 非冪等(取決于實現)
- 只需提供需要修改的字段
-
示例:
PATCH /users/123 HTTP/1.1 Host: example.com Content-Type: application/json{"email": "john.updated@example.com"}
-
響應狀態碼:
- 200 OK(更新成功)
- 204 No Content(更新成功無返回內容)
其他重要方法
6. HEAD
-
用途:獲取資源的元數據(不返回響應體)
-
特點:
- 與 GET 相同但不返回內容
- 用于檢查資源是否存在或驗證緩存
-
示例:
HEAD /document.pdf HTTP/1.1 Host: example.com
7. OPTIONS
-
用途:獲取資源支持的通信選項
-
主要應用:
- CORS 預檢請求(跨域資源共享)
-
示例響應:
HTTP/1.1 204 No Content Allow: GET, POST, OPTIONS Access-Control-Allow-Methods: GET, POST, PUT
8. TRACE
- 用途:回顯服務器收到的請求(用于診斷)
- 注意:存在安全風險(XST攻擊),通常禁用
9. CONNECT
-
用途:建立到目標資源的隧道(用于 HTTPS 代理)
-
格式:
CONNECT proxy.example.com:443 HTTP/1.1 Host: proxy.example.com
方法特性對比表
方法 | 安全 | 冪等 | 緩存 | 請求體 | 典型狀態碼 | RESTful 對應操作 |
---|---|---|---|---|---|---|
GET | 是 | 是 | 可 | 不可 | 200, 304 | 獲取資源 |
POST | 否 | 否 | 不可 | 可 | 201, 400 | 創建資源 |
PUT | 否 | 是 | 不可 | 可 | 200, 204 | 全量更新資源 |
DELETE | 否 | 是 | 不可 | 可選 | 200, 204, 404 | 刪除資源 |
PATCH | 否 | 可能 | 不可 | 可 | 200, 204 | 部分更新資源 |
HEAD | 是 | 是 | 可 | 不可 | 200 | 獲取元數據 |
OPTIONS | 是 | 是 | 不可 | 可選 | 204 | 獲取選項 |
TRACE | 是 | 是 | 不可 | 不可 | 200 | 診斷 |
CONNECT | 否 | 否 | 不可 | 可 | 200 | 建立隧道 |
關鍵概念解釋:
- 安全方法:不會修改服務器狀態(GET、HEAD、OPTIONS)
- 冪等方法:多次執行效果相同(GET、PUT、DELETE、HEAD)
RESTful API 設計規范
在 RESTful 架構中,HTTP 方法與資源操作有明確對應關系:
資源: /users+----------+---------------------+-----------------+
| 方法 | URL | 操作 |
+----------+---------------------+-----------------+
| GET | /users | 獲取用戶列表 |
| POST | /users | 創建新用戶 |
| GET | /users/{id} | 獲取單個用戶 |
| PUT | /users/{id} | 更新整個用戶 |
| PATCH | /users/{id} | 部分更新用戶 |
| DELETE | /users/{id} | 刪除用戶 |
+----------+---------------------+-----------------+
實際應用場景
1. 創建訂單(POST)
POST /orders HTTP/1.1
Content-Type: application/json{"product_id": 456,"quantity": 2,"payment_method": "credit_card"
}
2. 更新用戶郵箱(PATCH)
PATCH /users/789 HTTP/1.1
Content-Type: application/json{"email": "new.email@example.com"
}
3. 分頁獲取產品(GET)
GET /products?page=2&per_page=20 HTTP/1.1
4. 刪除評論(DELETE)
DELETE /comments/12345 HTTP/1.1
Authorization: Bearer xyz123
安全注意事項
-
敏感操作限制:
- 避免使用 GET 執行寫操作(防止 CSRF 攻擊)
- 關鍵操作(如刪除)應要求二次確認
-
冪等性設計:
- 重要操作(如支付)應設計為冪等
- 使用唯一 ID 防止重復提交
-
方法覆蓋攻擊防護:
- 某些框架允許通過
_method
參數覆蓋方法(如POST _method=DELETE
) - 確保覆蓋方法有與原方法相同的訪問控制
- 某些框架允許通過
瀏覽器支持情況
方法 | HTML 表單支持 | Fetch/XHR 支持 |
---|---|---|
GET | ? | ? |
POST | ? | ? |
PUT | ? | ? |
DELETE | ? | ? |
PATCH | ? | ? |
HEAD | ? | ? |
OPTIONS | ? | ? |
注意:HTML 表單只原生支持 GET 和 POST 方法。其他方法需要通過 JavaScript(Fetch/XHR)實現。
實踐
-
方法選擇原則:
-
API 版本控制:
GET /v2/products/123 HTTP/1.1
-
狀態碼規范:
- 成功:2xx
- 重定向:3xx
- 客戶端錯誤:4xx
- 服務器錯誤:5xx
-
HATEOAS 應用:
{"id": 123,"name": "Product","_links": {"self": {"href": "/products/123", "method": "GET"},"update": {"href": "/products/123", "method": "PUT"}} }
理解 HTTP 請求方法的區別和適用場景是設計高質量 API 的基礎。正確使用這些方法可以創建出符合 RESTful 原則、易于理解且安全的 Web 服務。