在 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 服务。