HTTP 方法参考¶
HTTP 方法表达客户端希望对目标资源执行的语义。 安全、幂等、可缓存是不同属性;它们不等同于“不会失败”“没有日志”或“没有请求体”。
方法对照¶
| 方法 | 主要语义 | 安全 | 幂等 | 响应通常可缓存 |
|---|---|---|---|---|
GET |
获取资源当前表示 | 是 | 是 | 是 |
HEAD |
获取与 GET 相同的响应头,不返回响应体 | 是 | 是 | 是 |
POST |
按资源定义处理提交内容 | 否 | 否 | 仅满足明确条件时 |
PUT |
用请求表示创建或完整替换目标资源 | 否 | 是 | 通常否 |
PATCH |
对资源应用部分修改 | 否 | 不一定 | 通常否 |
DELETE |
删除目标资源的关联 | 否 | 是 | 否 |
OPTIONS |
查询通信选项或 CORS 能力 | 是 | 是 | 通常否 |
CONNECT |
建立到目标的隧道 | 否 | 否 | 否 |
TRACE |
诊断请求回环 | 是 | 是 | 否 |
“通常可缓存”不代表浏览器一定缓存;还要满足状态码、认证上下文和缓存响应头要求。
安全与幂等¶
| 属性 | 定义 | 不代表什么 |
|---|---|---|
| 安全 | 客户端没有请求改变服务器状态 | 不保证服务器绝无日志、计费或统计副作用 |
| 幂等 | 多次相同请求的预期效果与一次相同 | 不保证每次响应、时间戳或日志完全相同 |
| 可缓存 | 响应可按规则存储并复用 | 不代表适合缓存敏感或个性化内容 |
GET 在协议语义上是安全且幂等的,但不保证物理上“无副作用”。
服务器可以记录访问、更新统计或产生计费;这些附带行为不应改变客户端请求的资源状态。
不得把删除、付款、发信等状态修改设计为 GET,否则预取、爬虫、缓存和重试可能触发操作。
GET 与 HEAD¶
| 要点 | 说明 |
|---|---|
| 参数位置 | 常放查询字符串,但 GET 语义不由参数位置决定 |
| 请求体 | 语义未被普遍定义,许多客户端、代理和服务端不支持 |
| 敏感数据 | 查询可能进入历史、日志、缓存键和 Referer |
| 条件请求 | If-None-Match、If-Modified-Since 可获得 304 |
| HEAD 响应 | 应与对应 GET 的头一致,但不发送响应体 |
POST、PUT 与 PATCH¶
| 方法 | 目标 URI 通常由谁选择 | 重复请求风险 | 典型用途 |
|---|---|---|---|
POST |
服务器或集合语义决定新资源 | 默认非幂等,重复可能创建两次或扣款两次 | 创建子资源、执行命令、复杂提交 |
PUT |
客户端知道并指定目标 URI | 幂等,重复完整替换的预期效果相同 | 创建或完整替换已知 URI 的资源 |
PATCH |
客户端指定目标 URI | 取决于补丁格式和业务设计 | 部分字段修改、应用补丁文档 |
POST 非幂等不表示它不能被设计成业务幂等。支付、创建订单等接口可使用幂等键、 唯一约束和结果查询,使网络超时后的安全重试成为可能。
PUT 的幂等性针对请求的预期效果;服务器仍可更新审计日志或版本记录。 PATCH 若表达“将名称设为 X”可能幂等,若表达“余额增加 10”通常不幂等。
DELETE、OPTIONS 与 CORS¶
- DELETE 是幂等的:首次可返回
204,再次可能返回404,响应不同不破坏幂等定义。 - 删除可能是软删除、异步处理或解除 URI 与资源的关联,具体由 API 契约定义。
- OPTIONS 可返回
Allow,跨源预检还会交换Access-Control-Request-*与 CORS 响应头。 - CORS 决定浏览器是否向脚本暴露跨源响应,不是认证或授权机制。
- TRACE 可能暴露请求信息,生产服务器通常禁用;CONNECT 通常由代理严格限制。
认证与授权¶
| 检查 | 要求 |
|---|---|
| 认证 | 验证会话、令牌或其他凭据,处理过期和撤销 |
| 功能级授权 | 用户是否可调用该方法或业务动作 |
| 对象级授权 | 用户是否可访问 URI 指向的具体对象 |
| 字段级授权 | 用户是否可修改请求中的具体字段 |
| CSRF | Cookie 会话的状态修改方法需要适当防护 |
隐藏按钮、改用 POST 或设置 CORS 都不能替代服务端授权。 所有敏感方法和凭据均应通过 HTTPS;方法本身不提供保密性。
缓存与重试¶
- GET 和 HEAD 最常被缓存,应使用
Cache-Control、验证器和正确的Vary。 - 含
Authorization或用户私有数据的响应必须明确控制共享缓存行为。 - POST 响应只有在满足明确新鲜度等条件时才可能缓存,实际支持有限。
- 自动重试优先限于幂等方法,并对
429、部分5xx和网络错误使用退避。 - 即使方法幂等,也要限制重试次数;超时不代表服务器未处理请求。
- 非幂等 POST 重试应依赖幂等键或先查询操作结果,不能盲目重复提交。
设计检查¶
- 方法是否与资源语义一致,而不是只按前端调用方便选择?
- GET 是否完全避免业务状态修改动作?
- PUT 是否表示目标资源的完整替换,PATCH 是否定义补丁格式?
- 每个对象和字段是否执行服务端授权?
- 缓存键、认证上下文、条件请求与重试策略是否明确?
- 状态码是否准确描述结果?参见 HTTP 消息。