跳转至

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 消息。

相关参考:URL 编码 · 质量检查