IETF(互联网工程任务组)最新发布的 RFC 10008 为 HTTP 家族添了一个新成员———正式定义 QUERY 方法,一个像 GET 一样安全、幂等,但可以带请求体的 HTTP 动词。
这事早在 HTTPbis 工作组里就有讨论,草案名叫 draft-ietf-httpbis-safe-method-w-body,现在终于定稿。QUERY 解决的问题很明确 ——GET 的 URL 长度有限、编码复杂查询参数不自然;POST 虽然能带 Body,但不是幂等的,CDN 不能缓存,中间件不敢自动重试。QUERY 就是要在协议层面把这两件事同时做到(GET 的语义 + POST 的表达能力)。

根据规范,QUERY 是安全的(不改变服务端资源状态),也是幂等的(同一个请求发多少次结果一样)。请求体里放什么由 Content-Type 决定——可以是 SQL、JSONPath、XSLT,也可以是普通的表单数据。服务端通过一个新的响应头 Accept-Query 告诉客户端自己接受哪些查询格式。

几个设计细节:
- Content-Type 是强制的,不带的请求服务端必须返回 400
- 响应可以用 Content-Location 指向本次查询的具体结果,用 Location 指向一个等效资源——客户端下次可以直接用 GET 访问那个 URI,不用再发请求体
- QUERY 的响应可以被缓存,但缓存键必须包含完整请求内容。缓存中间件可以做语义归一化(比如去掉 JSON 里的空格),除非客户端发了 no-transform
- 跨域 QUERY 请求需要 OPTIONS 预检,不是 CORS 安全方法
作者是 HTTP 工作组的熟面孔:Julian Reschke(greenbytes)、James Snell(Cloudflare)、Mike Bishop(Akamai)。草案原名 draft-ietf-httpbis-safe-method-w-body,早期甚至考虑过复用 WebDAV 的 SEARCH 方法,但最终选了 QUERY——因为它"更好地捕捉了与 URI 查询组件的关联"。