HTTP 请求方法 #

HTTP(超文本传输协议)请求方法是客户端向服务器发送请求时使用的动作指令,用于指定对目标资源执行的操作类型。HTTP/1.1 规范定义了多种请求方法,每种方法都有其特定的语义和用途。

请求方法的分类 #

HTTP 请求方法可以根据其特性分为以下几类:

1. 安全方法(Safe Methods) #

  • 不会对服务器资源产生副作用
  • 仅用于获取资源信息,不会修改资源
  • 例如:GET、HEAD、OPTIONS

2. 幂等方法(Idempotent Methods) #

  • 多次执行相同的请求与执行一次的效果相同
  • 例如:GET、HEAD、PUT、DELETE、OPTIONS

3. 可缓存方法(Cacheable Methods) #

  • 响应可以被缓存
  • 例如:GET、HEAD

HTTP 请求方法详细说明 #

方法 描述 是否安全 是否幂等 是否可缓存 主要用途
GET 请求指定的资源。只用于获取数据,不应产生副作用。 ✅ ✅ ✅ 获取资源信息
POST 向指定资源提交数据,通常会导致服务器状态变化或产生新资源。 ❌ ❌ ❌ 创建新资源
PUT 用请求数据替换目标资源的所有当前表示。 ❌ ✅ ❌ 更新整个资源
DELETE 删除指定的资源。 ❌ ✅ ❌ 删除资源
PATCH 对资源进行部分修改。 ❌ ❌ ❌ 部分更新资源
HEAD 与GET相同,但只返回响应头,不返回响应体。 ✅ ✅ ✅ 检查资源是否存在或获取元数据
OPTIONS 描述目标资源的通信选项。 ✅ ✅ ❌ 查询服务器支持的HTTP方法
TRACE 沿路径到目标资源的消息回环测试。 ✅ ✅ ❌ 诊断和调试
CONNECT 建立到目标资源的隧道。 ❌ ❌ ❌ 建立网络连接隧道

详细说明 #

GET #

  • 功能:获取指定资源的表示形式
  • 特点:
    • 请求参数通过URL传递
    • 有长度限制(取决于浏览器和服务器)
    • 可以被缓存、收藏为书签
    • 不应用于敏感数据的传输

POST #

  • 功能:向服务器提交数据,通常用于创建新资源
  • 特点:
    • 请求参数通过请求体传递
    • 没有长度限制
    • 不可缓存
    • 适合传输大量数据或敏感信息

PUT #

  • 功能:完整更新指定资源
  • 特点:
    • 需要提供完整的资源表示
    • 如果资源不存在,可以创建新资源
    • 幂等性:多次执行效果相同

DELETE #

  • 功能:删除指定资源
  • 特点:
    • 幂等性:多次删除同一资源效果相同
    • 删除操作可能需要权限验证

PATCH #

  • 功能:对资源进行部分更新
  • 特点:
    • 只需要提供需要修改的部分数据
    • 非幂等:多次执行可能产生不同结果
    • 常用于API的增量更新
  • 功能:获取资源的元数据
  • 特点:
    • 响应不包含消息体
    • 用于检查资源是否存在、是否被修改
    • 节省带宽,提高性能

OPTIONS #

  • 功能:查询服务器支持的HTTP方法
  • 特点:
    • 常用于CORS(跨域资源共享)预检请求
    • 返回Allow头信息列出支持的方法
    • 安全且幂等的方法
    • 响应通常不包含消息体

OPTIONS 方法的主要使用场景: #

1. CORS 预检请求(Preflight Request)

  • 当浏览器发送跨域请求且请求方法不是简单方法(GET、POST、HEAD)时
  • 当请求包含自定义头部时
  • 当请求的Content-Type不是简单内容类型时

示例:

http
OPTIONS /api/users HTTP/1.1
Host: example.com
Origin: https://mydomain.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: Content-Type,Authorization

服务器响应:

http
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://mydomain.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400
Allow: GET, POST, PUT, DELETE, OPTIONS

2. API 发现和文档

  • 客户端可以查询API端点支持哪些操作
  • 用于构建动态的API客户端
  • 提供API的自我描述能力

3. 权限检查

  • 检查当前用户对特定资源有哪些操作权限
  • 根据用户角色返回不同的允许方法列表

4. 服务器能力探测

  • 探测服务器是否支持某些HTTP扩展方法
  • 检查服务器是否支持特定的协议特性

OPTIONS 请求的响应头说明: #

  • Allow:列出服务器对该资源支持的所有HTTP方法
  • Access-Control-Allow-Methods:CORS中允许的跨域请求方法
  • Access-Control-Allow-Headers:CORS中允许的请求头
  • Access-Control-Allow-Origin:允许跨域请求的源
  • Access-Control-Max-Age:预检请求的缓存时间

实际应用示例: #

RESTful API 中的OPTIONS使用:

bash
# 查询用户API支持的方法
curl -X OPTIONS https://api.example.com/users

# 响应示例
HTTP/1.1 200 OK
Allow: GET, POST, OPTIONS
Content-Length: 0

Web应用中的CORS处理:

javascript
// 前端发送跨域PUT请求前,浏览器会自动发送OPTIONS预检请求
fetch('https://api.example.com/users/123', {
  method: 'PUT',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer token'
  },
  body: JSON.stringify({name: 'John'})
});

服务器端OPTIONS处理(Node.js示例):

javascript
app.options('/api/users/:id', (req, res) => {
  res.header('Access-Control-Allow-Origin', '*')
  res.header('Access-Control-Allow-Methods', 'GET, PUT, DELETE, OPTIONS')
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization')
  res.header('Access-Control-Max-Age', '86400')
  res.header('Allow', 'GET, PUT, DELETE, OPTIONS')
  res.status(200).send()
});

最佳实践: #

  1. 为所有API端点实现OPTIONS方法:提供完整的API自描述能力
  2. 合理设置CORS头:根据安全需求配置允许的源和方法
  3. 利用缓存:设置适当的Access-Control-Max-Age减少预检请求
  4. 权限感知:根据用户权限动态返回允许的方法列表
  5. 一致性:确保OPTIONS返回的方法与实际实现的方法一致
  • 返回Allow头信息列出支持的方法

TRACE #

  • 功能:诊断请求路径
  • 特点:
    • 服务器返回接收到的请求消息
    • 用于调试和诊断
    • 现代浏览器通常禁用此方法

CONNECT #

  • 功能:建立网络隧道
  • 特点:
    • 主要用于SSL/TLS连接的代理
    • 将连接转换为透明的TCP/IP隧道

使用场景示例 #

RESTful API 设计 #

  • GET /api/users - 获取用户列表
  • POST /api/users - 创建新用户
  • GET /api/users/1 - 获取ID为1的用户信息
  • PUT /api/users/1 - 更新用户1的全部信息
  • PATCH /api/users/1 - 部分更新用户1的信息
  • DELETE /api/users/1 - 删除用户1

网页应用 #

  • GET - 页面加载、资源获取
  • POST - 表单提交、文件上传
  • PUT/PATCH - 数据更新操作
  • DELETE - 删除操作

最佳实践 #

  1. 正确使用语义:根据操作意图选择合适的方法
  2. 幂等性考虑:对于重要操作,优先选择幂等方法
  3. 安全性:敏感操作使用POST而非GET
  4. 缓存优化:合理利用GET和HEAD的可缓存特性
  5. API设计:遵循RESTful原则,保持接口一致性

总结 #

HTTP请求方法是Web开发的基础,正确理解和使用各种方法对于构建高效、安全的Web应用至关重要。每种方法都有其特定的语义和适用场景,开发者应根据实际需求选择最合适的方法。

最后更新:2026-02-05