HTTP 终于解决了几十年的尴尬:复杂查询不用再借 POST 了

导读做后端开发的朋友,多半都遇到过这个尴尬:

做后端开发的朋友,多半都遇到过这个尴尬:

写了个多条件复杂搜索接口,参数太多,拼 URL 拼到长度超了,怎么办?

只能改成 POST。

但你改的时候,心里肯定会犯嘀咕:这明明是查询操作,为什么要用 POST?

现在好了,这个持续几十年的小尴尬,终于被 IETF 解决了。

新的 HTTP 标准 RFC 10008 正式定义了一个新请求方法:QUERY。

专门给需要带请求体的复杂只读查询用。

三种 HTTP 方法特性对比

其实这个问题存在几十年了:

现在的解法,天生拧巴。GET 什么都好,语义对,能缓存,能存书签,就是 URL 长度有限制,复杂查询条件塞不下。POST 能塞下任意长度的请求体,但语义不对——POST 本来是给创建、修改操作用的,默认不缓存,也没法存书签分享。

所以这些年大家一直凑合用:简单查询用 GET,复杂查询就凑合写 POST。功能能用,但就是别扭。

我自己写接口也这样,超过十个条件的动态查询,直接上 POST,语义什么的,先放一边。

这次 QUERY 标准出来,其实就是给这个多年的惯例「正名」:你要做只读查询,又需要很长的请求体,QUERY 就是正确的选择。

它保留了 GET 所有优点:语义正确(只读查询),幂等(查多少次结果都一样),可以被缓存,支持存书签、分享链接。同时又有 POST 的优点:支持任意长度的请求体。

说白了,就是把大家一直在做的事情,给了一个正确的名分。没什么革命,但痛点解决了。

我们需要立刻改代码吗?

完全不用。

对普通业务开发者来说:简单查询继续用 GET,没事;现在用 POST 写的复杂查询,也不用急着改;以后遇到新的复杂查询场景,可以直接用 QUERY。

真正受益的是框架作者、CDN 服务商和服务端开发者:以后复杂查询也能享受缓存了,命中率上去,服务器压力下来,用户访问也更快。

算是一个皆大欢喜的小改进。

有意思的是,HTTP 发展这么多年,居然到现在才补上这么基础的一块。

只能说,原来的凑合用能用,所以大家也就忍了几十年。

这次终于有人站出来说,「我们把这个小问题解决了吧」——挺好。