RFC 10008: HTTP QUERY 方法

Lobsters Hottest 新闻

摘要

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 方法

Lobsters Hottest

RFC 10008 定义了 HTTP QUERY 方法,这是一种安全且幂等的请求方法,允许在请求体中发送查询负载,弥合了 GET 和 POST 在查询操作之间的差距。

新HTTP QUERY方法详解

Hacker News Top

文章解释了RFC 10008中定义的新HTTP QUERY方法,该方法通过提供一种标准、安全且幂等的带请求体方法,解决了GET和POST在复杂查询方面的限制。

HTTP QUERY 方法

Lobsters Hottest

本互联网草案定义了 HTTP QUERY 方法,这是一种安全且幂等的方法,允许请求处理封装的内容并返回结果,类似于 POST 但不会带来部分状态变更的风险。

Quack:DuckDB 的客户端-服务器协议

Hacker News Top

DuckDB 引入了名为“Quack”的全新客户端-服务器协议,使得 DuckDB 实例能够通过 HTTP 进行通信,在支持并发写入和远程访问的同时,保持简单性与高性能。