Java基础、中级、高级、架构面试资料

HTTP QUERY 方法来了,RFC 10008 正式发布,再见 GET 和 POST

JAVA herman 32浏览
公告:“业余草”微信公众号 AI 中转站提供免费体验,点击链接 https://unity2.ai/register?ref=3XTnndN2 进行访问,支持 Claude、ChatGPT、Gemini 等最新模型!关注业余草微信公众号,添加作者微信:xttblog2!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
【腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

程序员又来需求了,这样的需求多来一打,会不会增加一些工作岗位呢?不好说,说不定新需求来了 AI 也更更聪明了。

最近,我看到 IETF 正式发布了 RFC 10008,这个提案为 Http 新增了一个 QUERY 方法,为 REST API 设计迎来了新篇章。

这个 RFC 10008 是 2026 年 6 月 16 日正式发布的。它定义了全新的 HTTP 请求方法 QUERY,填补了 GET 和 POST 之间长期存在的空白。让它既能像 POST 一样携带请求体传输复杂查询,又能像 GET 一样保持安全、幂等和可缓存的语义。

接下来,我们就一起来围绕这个 http QUERY 方法,解读它的设计背景、核心特性、实际应用场景以及落地前景。

文章配图参见 https://mp.weixin.qq.com/s/uA1z0qUiBCz_Zt6iZN_-7g

复杂查询该用 GET 还是 POST?

写过 Java 的都知道,在 RESTful API 设计中,查询数据本该是 GET 的“主场”。这种做法在简单场景下,一切都很美好。

GET /api/v1/users?role=admin&status=active&sort=desc HTTP/1.1

但当查询条件变得复杂,比如多层嵌套过滤、复杂的关系查询、长文本搜索、或者包含数十个参数的报表查询,这种情况下各种问题就接踵而至了。

  • URL 长度限制:浏览器和代理服务器通常对 URL 长度有 2KB~8KB 的限制,复杂查询很容易“爆表”
  • 编码噩梦:特殊字符、非 ASCII 内容需要 URL 编码,不仅增加体积,还严重降低可读性
  • 数据结构表达困难:数组怎么传??roles[0]=admin 还是 ?roles=admin&roles=reporter?不同框架处理方式各异
  • 安全隐患:查询参数会被记录在服务器日志、浏览器历史、甚至第三方分析工具中,敏感信息容易泄露
  • 资源标识混乱:每一种查询参数组合都被视为一个“独立资源”,违背了 REST 的资源定位原则

那用 POST 带请求体?这确实也是业界多年来的“潜规则” workaround。但 POST 的语义是“非幂等的资源创建/处理”,用它来执行只读查询,等于向整个 HTTP 基础设施“撒谎”。

  • CDN 和代理不会缓存 POST 响应
  • 自动重试机制不敢对 POST 请求“动手”,因为担心重复提交导致副作用
  • 监控和日志系统无法区分”创建订单”和”搜索订单”

在这方面,GraphQL 就是一个典型例子,所有操作(包括纯查询)都走 POST,导致 HTTP 层级的缓存和重试优势完全丧失,社区不得不发明 persisted queries、CDN 专用规则等 workaround 来弥补。

QUERY 方法

2026 年 6 月 16 日,IETF 正式发布了 RFC 10008(The HTTP QUERY Method),为这个困扰多年的问题给出了标准答案。

QUERY 方法就是同时有 GET 的语义 + POST 的载体。

核心定义

QUERY 方法本质上是一个可以携带请求体的 GET。RFC 10008 明确其语义,如下所示。

A QUERY requests that the request target process the enclosed content in a safe and idempotent manner and then respond with the result of that processing.

下面,用一张表来对比三种方法的差异。

特性GETPOSTQUERY
安全(无副作用)
幂等(可安全重试)
可缓存实际不可
携带请求体
语义清晰度模糊

一个典型的 QUERY 请求

QUERY /contacts HTTP/1.1
Host: api.example.com
Content-Type: application/json
Accept: application/json

{
  "filter": {
    "department": "engineering",
    "skills": ["Go", "Rust"],
    "hire_date": { "gte": "2023-01-01" }
  },
  "sort": [{ "field": "level", "order": "desc" }],
  "page": { "size": 20, "token": "abc123" }
}

服务器返回如下所示。

HTTP/1.1 200 OK
Content-Type: application/json
Accept-Query: "application/json", "application/sql"

[ { "name": "Alice", "level": "P8" }, ... ]

QUERY 方法解决了什么核心问题?

其实上面已经解释的差不多了,下面我们来看看官方给出的更纯正的说法。

语义正确性

QUERY 让 API 设计回归“诚实”,只读查询就是只读查询,不再需要用 POST “伪装”。这对基础设施的每一层都意义重大。

  • 代理/CDN:看到 QUERY 就知道可以缓存、可以重试
  • 客户端 SDK:可以安全地实现自动重试和断路器
  • 监控系统:能准确区分”读操作”和”写操作”的流量模式
  • API 文档:开发者一看方法就知道这个端点是查询而非创建

复杂查询的表达自由

JSON、SQL、JSONPath、GraphQL 查询语句……只要服务器支持,都可以放在请求体中。RFC 10008 引入了新的响应头 Accept-Query,服务器用它来声明支持的查询格式。

Accept-Query: "application/json", "application/sql;charset=UTF-8", "application/jsonpath"

缓存机制

QUERY 响应是可缓存的,但缓存键需要同时考虑 URL 和请求体内容。RFC 10008 允许对请求体进行“语义规范化”(如忽略空白差异)来提升缓存命中率。服务器还可以通过 Location 响应头为查询结果分配一个持久 URI,后续客户端可以直接用 GET 访问这个 URI,避免重复发送查询体。

自动重试的安全性

因为 QUERY 是幂等的,客户端在遭遇网络超时、连接中断时,可以放心地自动重试,无需担心重复执行导致数据不一致。这是 POST 查询永远无法提供的保障。

何时落地?

看起来 Http 的这个 Query 方法好处挺多的,哪它什么时候能真正落地呢,接下来我们看看官方给出的进展。

支持进展

RFC 10008 目前处于提议标准(Proposed Standard)阶段,这意味着。

  • 标准已获 IETF 批准,技术方案稳定
  • 广泛落地仍需时间,取决于浏览器、服务器、框架、代理、工具链的逐步适配

目前已知支持或正在适配的程序或工具部分列举如下。

  • curl:已支持(使用 -X QUERY--request QUERY),Daniel Stenberg(curl 作者)已发文确认
  • Kreya:API 调试工具 Kreya 在 1.20 版本中已原生支持 QUERY 方法
  • 部分 Web 框架:如 .NET 10 可通过 app.MapMethods(pattern, ["QUERY"], handler) 手动暴露端点

尚未完全支持的部分列举如下。

  • 主流浏览器:目前 HTML 表单仍只支持 GET/POST,浏览器默认不会发送 QUERY 请求
  • OpenAPI/Postman:这些 API 文档和测试工具尚未原生建模 QUERY 方法
  • Nginx/Apache/CDN:大多数反向代理和 CDN 默认只放行”标准”HTTP 方法,需要配置调整

什么时候该用?

如果未来 2 年内都得到支持了,包括 Java 基础类库,Spring 生态里的一些框架等,那么下面这些场景就可以使用上 Http 的 Query 方法了。

场景推荐方法
简单查询,参数少,需要分享/收藏链接GET
复杂查询,嵌套过滤,大量参数,JSON 结构QUERY
创建/更新/删除资源POST / PUT / PATCH / DELETE
需要立即分享查询结果的链接GET(QUERY 的请求体无法编码到 URL 中)

最后

RFC 10008 的发布,不是对 GET 或 POST 的否定,而是对 HTTP 方法语义完整性的补全。它解决了一个几乎所有 API 开发者都遇到过、却长期没有标准答案的问题。

当然,从“提议标准”到“全面落地”,QUERY 还需要数年时间。浏览器支持、框架原生集成、基础设施适配、开发者习惯培养,每一步都需要时间。但正如 HTTP/2、HTTP/3 的普及历程一样,一旦生态成熟,QUERY 将成为复杂查询场景的默认选择。

QUERY 对带来一大批新需求,尤其是各种基础设施,包括浏览器、各种语言类库、开源框架、应用程序等。在不久的将来,内部系统、微服务间通信、API 调试工具等可控环境中,QUERY 肯定会流行起来。毕竟,语义正确的 API 设计,是构建可维护系统的基石

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » HTTP QUERY 方法来了,RFC 10008 正式发布,再见 GET 和 POST