HTTP 迎来 20 年来首个新方法
你可能以前也遇到过这种情况。
你需要搜索产品。由于搜索过滤器太大,无法放入 URL 中。为了解决这个问题,你使用了 POST 请求。
这行得通,但它其实是一种“谎言”。你告诉 HTTP 你正在修改数据,而实际上你只是在读取数据。
2026 年 6 月,IETF 发布了 RFC 10008。它定义了一个名为 QUERY 的新 HTTP 方法。这是二十多年来新增的首个方法,它恰好解决了上述问题。
当前存在的问题
GET 非常适合读取数据。它是安全的且可缓存的。但它无法携带请求体(request body)。此外,URL 也有字符限制。
POST 可以携带请求体。但 HTTP 协议假设 POST 会改变状态。这意味着你会失去自动缓存和安全重试的能力。如果一个 POST 请求超时了,你不能简单地重试它,因为你不知道服务器是否已经执行了某些操作。
解决方案:QUERY
QUERY 是一个带有请求体的 GET 请求。它提供了两个保证:
- 它是安全的。它不会修改数据。
- 它是幂等的。发送两次的结果与发送一次的结果相同。
如何在当下使用
你现在就可以通过 Axios 或 Fetch 来使用它。
Axios 示例:
axios.request({
method: 'QUERY',
url: '/api/products',
data: { category: 'shoes', maxPrice: 100 }
})
Fetch 示例:
fetch('/api/products', {
method: 'QUERY',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ category: 'shoes', maxPrice: 100 })
})
后续展望
这种转变不会一蹴而就。以下是路线图:
- 基础设施:Nginx 和 Apache 将会透传这些请求。你可能需要更新你的 WAF 或安全规则以允许 QUERY 方法。
- 框架:预计 Spring、Rails 和 Express 将在 2026 年至 2027 年期间陆续添加原生支持。
- CDN:由于 Cloudflare 和 Akamai 的工程师参与了该标准的编写,预计 CDN 会迅速提供支持。这将使缓存变得更加容易。
为什么这对你的代码很重要
- 自动重试:由于 QUERY 是幂等的,移动应用和客户端可以安全地重试失败的请求。
- 更佳的缓存:CDN 可以根据请求体来缓存 QUERY 的响应。你可以删掉自己手动实现的 Redis 缓存层了。
- 更简洁的 URL:你不再需要将复杂的 JSON 塞进 URL 查询参数中。
- 语义化 API:你的 API 文档会变得更加清晰。开发者能准确知道哪些端点是读取数据的,哪些是写入数据的。
通过审计当前的 POST 端点来让你的团队做好准备。识别出哪些端点仅用于读取数据,它们就是你未来的 QUERY 端点。
