HTTP 请求方法详解:GET、POST、PUT、DELETE 等

发布于:2025-07-13 ⋅ 阅读:(19) ⋅ 点赞:(0)

在 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

安全注意事项

  1. 敏感操作限制

    • 避免使用 GET 执行写操作(防止 CSRF 攻击)
    • 关键操作(如删除)应要求二次确认
  2. 幂等性设计

    • 重要操作(如支付)应设计为幂等
    • 使用唯一 ID 防止重复提交
  3. 方法覆盖攻击防护

    • 某些框架允许通过 _method 参数覆盖方法(如 POST _method=DELETE
    • 确保覆盖方法有与原方法相同的访问控制

浏览器支持情况

方法 HTML 表单支持 Fetch/XHR 支持
GET
POST
PUT
DELETE
PATCH
HEAD
OPTIONS

注意:HTML 表单只原生支持 GET 和 POST 方法。其他方法需要通过 JavaScript(Fetch/XHR)实现。

实践

  1. 方法选择原则

    创建
    更新
    删除
    操作类型
    查询数据?
    GET
    修改数据?
    POST
    全量更新?
    PUT
    PATCH
    DELETE
  2. API 版本控制

    GET /v2/products/123 HTTP/1.1
    
  3. 状态码规范

    • 成功:2xx
    • 重定向:3xx
    • 客户端错误:4xx
    • 服务器错误:5xx
  4. HATEOAS 应用

    {
      "id": 123,
      "name": "Product",
      "_links": {
        "self": {"href": "/products/123", "method": "GET"},
        "update": {"href": "/products/123", "method": "PUT"}
      }
    }
    

理解 HTTP 请求方法的区别和适用场景是设计高质量 API 的基础。正确使用这些方法可以创建出符合 RESTful 原则、易于理解且安全的 Web 服务。


网站公告

今日签到

点亮在社区的每一天
去签到