之前关于 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 是较新的标准,部分老旧代理/防火墙/框架尚未完全支持,上线前应做兼容测试。