我们伪造了 16 年之久的 HTTP 方法
后端开发人员在处理搜索端点时一直面临着一个难题。
你想使用 GET,因为搜索是一个读取操作。但你的搜索过滤器变得越来越大。你的 URL 达到了两千个字符。代理服务器会截断你的请求。你的搜索功能就会失效。
为了解决限制,你切换到了 POST。这虽然有效,但却是一个谎言。POST 会告诉所有的代理和缓存你正在修改数据。这会停止所有的缓存。你失去了 GET 的速度。
十六年来,我们一直缺乏折中方案。
2026 年 6 月,IETF 发布了 RFC 10008。它引入了 QUERY 方法。这是自 2010 年以来推出的第一个新的 HTTP 方法。
QUERY 结合了 GET 和 POST 的优点:
• 它携带请求体以处理复杂的过滤器。 • 它是安全的 (safe),意味着服务器不会改变状态。 • 它是幂等的 (idempotent),意味着你可以运行两次并获得相同的结果。 • 它是可缓存的 (cacheable),允许 CDN 存储响应。
一个 QUERY 请求如下所示:
QUERY /products HTTP/1.1
Host: api.shop.example
Content-Type: application/json
{
"filter": { "category": "boots", "inStock": true },
"sort": "-price",
"limit": 20
}
新的 RFC 还增加了 Accept-Query 请求头。这让 API 可以告诉你它支持哪些查询格式。
给开发人员的一个警告:
缓存 QUERY 请求与缓存 GET 请求不同。GET 缓存使用 URL 作为键 (key)。QUERY 缓存必须将请求体作为键的一部分。如果你的基础设施不理解这一点,一个用户可能会看到另一个用户的私有搜索结果。
不要急于在生产环境中使用它。生态系统需要时间来跟进。
• 浏览器目前在 fetch() 中还不支持 QUERY。
• HTML 表单仅支持 GET 和 POST。
• 许多 API 网关和 WAF 会拒绝未知的请求方法。
在设计 API 时可以考虑到 QUERY,但目前请保留你的 POST 端点。
QUERY 结束了长期的妥协。它让你可以在不向网络“撒谎”的情况下提出复杂的问题。
你是在等待生态系统跟进,还是现在就开始测试 QUERY 了呢?
Source: https://dev.to/arya_koste_5845807df94776/query-the-http-method-weve-been-faking-for-16-years-f9i
