TOC

HTTP Query 方法

之前关于 Query 方法写过一篇文章:HTTP 协议新提案:Query 方法,现在听说已经成为技术标准了。

其前身 draft-snell-search-method(早期叫 SEARCH / 带 body 的安全方法)最早约在 2015 年 4 月 提交 IETF Internet-Draft;
后改组为 draft-ietf-httpbis-safe-method-w-body,HTTP 工作组的正式草案首版约 2020 年 9 月 发布。
经多轮修订后,IETF 于 2026 年 6 月 16 日 正式发布为 RFC 10008《The HTTP QUERY Method》,类别为 Proposed Standard(提议标准)。

📌 背景与动机

传统 REST API 在做复杂查询(深层嵌套过滤、大 JSON 条件、关联查询)时面临两难:

  • GET + URL 查询参数:URL 有长度/字符限制,复杂结构难编码,且可能暴露敏感参数于日志中。
  • GET + Request Body:HTTP 规范未禁止但未定义语义,多数代理/防火墙/服务器会丢弃或拒绝 body,兼容性差。
  • POST 替代查询:POST 语义是"非安全、非幂等"(用于创建/处理),导致无法被缓存、不能安全自动重试,中间件也无法识别其为只读操作。

HTTP QUERY 方法(RFC 10008)

新定义的 QUERY 方法 = GET 的语义 + POST 的请求体

  • Safe(安全):不产生副作用,不改变服务器状态。
  • Idempotent(幂等):可安全自动重试。
  • 支持 Request Body:复杂查询条件放 body 中,避开 URL 长度限制。
  • 可缓存:但缓存键(Cache Key)必须纳入请求体内容。
  • 典型用途:替代"用 POST 做只读查询"的反模式。

🔄 三种方法对比

特性 GET QUERY POST
安全(Safe)
幂等(Idempotent)
可缓存 ✅(含 body 做 key) ⚠️ 通常不
请求体(Request Body) ❌(无定义语义)
查询条件位置 URL Request Body Request Body
语义 获取资源表示 执行安全查询 创建/处理

💡 实践建议

  • 简单过滤仍用 GET + query string
  • 当查询条件复杂到不适合 URL 时,用 QUERY 替代 POST 做只读搜索
  • 需注意:QUERY 是较新的标准,部分老旧代理/防火墙/框架尚未完全支持,上线前应做兼容测试。
如果你有魔法,你可以看到一个评论框~