RFC 10008: HTTP QUERY 方法
摘要
RFC 10008 定义了新的 HTTP QUERY 方法,允许包含请求体的安全、幂等且可缓存的请求,解决了 GET 和 POST 在 RPC 风格 API 中的局限性。
<p><a href="https://lobste.rs/s/y9zfbv/rfc_10008_http_query_method">评论</a></p>
查看缓存全文
缓存时间: 2026/06/18 12:02
# RFC 10008: HTTP QUERY 方法
来源:https://blainsmith.com/articles/rfc-10008-http-query-method/
2026年6月17日
RFC 10008(https://www.rfc-editor.org/info/rfc10008)于2026年6月15日发布,定义了一个新的 HTTP 方法:`QUERY`。它填补了一个自我开始构建 API 以来就存在的空白:你需要向服务器发送数据以描述你想要什么,但 `GET` 没有请求体,而 `POST` 既不安全也不幂等。`QUERY` 提供了一种方法,它接受请求体,同时保持安全、幂等和可缓存。
如果你曾经构建过与 JSON-RPC API 交互的 SDK,你应该体会过这种痛苦。JSON-RPC 的设计要求发送一个描述方法和参数的 JSON 载荷。这个载荷必须放在请求体中,这意味着使用 `POST`,进而导致缓存和中间件将每个请求视为状态变更操作。重试逻辑变得复杂,CDN 缓存无从谈起。最终你不得不构建自己的应用层缓存,因为 HTTP 的内置机制无法帮助你。
`QUERY` 改变了这一点。它的语义很简单:发送请求体,获得响应,而从缓存和安全的角度来看,整个交互过程被视为一次 `GET`。
## 在 Go 中
Go 的 `net/http`(https://pkg.go.dev/net/http)已经允许你通过 `http.NewRequest`(https://pkg.go.dev/net/http#NewRequest)使用任意方法字符串,因此使用 `QUERY` 的 SDK 代码看起来和你想的差不多:
```
body, _ := json.Marshal(map[string]any{
"jsonrpc": "2.0",
"method": "getScore",
"params": []any{"0xABC123", "latest"},
"id": 1,
})
req, _ := http.NewRequestWithContext(ctx, "QUERY", "https://rpc.example.com", bytes.NewReader(body))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
```
无需新的依赖。标准库就能处理,因为 HTTP 方法只是字符串。
## 在 Rust 中
使用 `reqwest`(https://docs.rs/reqwest/latest/reqwest/)时,你可以用 `reqwest::Method`(https://docs.rs/http/latest/http/method/struct.Method.html)定义自定义方法:
```
use reqwest::{Client, Method};
let client = Client::new();
let query_method = Method::from_bytes(b"QUERY").unwrap();
let resp = client
.request(query_method, "https://rpc.example.com")
.header("Content-Type", "application/json")
.body(r#"{"jsonrpc":"2.0","method":"getScore","params":["0xABC123","latest"],"id":1}"#)
.send()
.await?;
```
## 缓存
我一直期待的正是第 2.7 节的内容。对 `QUERY` 的响应是可缓存的,并且缓存键必须包含请求体及其元数据。这意味着反向代理或 CDN 可以结合 `Content-Type` 和请求体字节来为相同查询提供缓存响应。缓存还可以规范化请求体(重新排列 JSON 键、去除无关空白)以提高命中率。
对于语义上全是读取操作、但结构上却是 `POST` 的 RPC 风格 API 来说,这是一个有意义的改进。你无需构建定制的上层缓存,就能获得 HTTP 原生的缓存支持。
RFC 篇幅简短且易读。如果你构建或使用 HTTP API,花20分钟阅读它很值得。
相似文章
RFC 10008: HTTP QUERY 方法
RFC 10008 定义了 HTTP QUERY 方法,这是一种安全且幂等的请求方法,允许在请求体中发送查询负载,弥合了 GET 和 POST 在查询操作之间的差距。
新HTTP QUERY方法详解
文章解释了RFC 10008中定义的新HTTP QUERY方法,该方法通过提供一种标准、安全且幂等的带请求体方法,解决了GET和POST在复杂查询方面的限制。
HTTP QUERY 方法
本互联网草案定义了 HTTP QUERY 方法,这是一种安全且幂等的方法,允许请求处理封装的内容并返回结果,类似于 POST 但不会带来部分状态变更的风险。
通过HTTP提供文件的三种方式:同步、epoll和io_uring
一篇技术文章,比较了通过HTTP提供文件的三种方法:同步的每个请求一个线程、基于epoll的异步I/O和io_uring,并附有C语言代码示例。
Quack:DuckDB 的客户端-服务器协议
DuckDB 引入了名为“Quack”的全新客户端-服务器协议,使得 DuckDB 实例能够通过 HTTP 进行通信,在支持并发写入和远程访问的同时,保持简单性与高性能。