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的增量更新
HEAD #
- 功能:获取资源的元数据
- 特点:
- 响应不包含消息体
- 用于检查资源是否存在、是否被修改
- 节省带宽,提高性能
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()
});
最佳实践: #
- 为所有API端点实现OPTIONS方法:提供完整的API自描述能力
- 合理设置CORS头:根据安全需求配置允许的源和方法
- 利用缓存:设置适当的Access-Control-Max-Age减少预检请求
- 权限感知:根据用户权限动态返回允许的方法列表
- 一致性:确保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 - 删除操作
最佳实践 #
- 正确使用语义:根据操作意图选择合适的方法
- 幂等性考虑:对于重要操作,优先选择幂等方法
- 安全性:敏感操作使用POST而非GET
- 缓存优化:合理利用GET和HEAD的可缓存特性
- API设计:遵循RESTful原则,保持接口一致性
总结 #
HTTP请求方法是Web开发的基础,正确理解和使用各种方法对于构建高效、安全的Web应用至关重要。每种方法都有其特定的语义和适用场景,开发者应根据实际需求选择最合适的方法。
最后更新:2026-02-05