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