Rust中Reqwest响应解析比Postman/Firefox慢10倍的问题排查
问题原因与解决方案
核心原因:未启用响应压缩
Postman、Firefox以及浏览器的fetch()都会自动发送Accept-Encoding请求头,请求服务器返回gzip/brotli/deflate压缩后的内容,大幅减少传输的数据量。而reqwest默认不自动启用压缩支持,导致你需要读取原始的大体积响应体(比如https://registry.npmjs.org/react的响应原始大小约为1.5MB,压缩后仅约300KB),这直接导致读取耗时激增。
另外,send().await仅完成请求发送与响应头接收,并未开始读取响应体,所以耗时正常;而text()/bytes()等方法需要读取完整响应体,未压缩的大体积数据会显著拉长耗时。
解决方案:启用reqwest的压缩特性
- 修改Cargo.toml,添加reqwest的压缩相关特性:
# 异步客户端 reqwest = { version = "0.11", features = ["tokio-rustls", "gzip", "brotli"] } # 阻塞客户端 reqwest = { version = "0.11", features = ["blocking", "gzip", "brotli"] }
- 构建客户端时启用自动压缩:
异步版本修改后代码:
use std::time::Instant; #[tokio::main] async fn main() { let client = reqwest::Client::builder() .gzip(true) .brotli(true) .build() .unwrap(); let response = client .get("https://registry.npmjs.org/react") .send() .await .unwrap(); let now = Instant::now(); let data = response.text().await.unwrap(); let elapsed = now.elapsed(); println!("{}ms", elapsed.as_millis()); }
阻塞版本修改后代码:
use std::time::Instant; fn main() { let client = reqwest::blocking::Client::builder() .gzip(true) .brotli(true) .build() .unwrap(); let now = Instant::now(); let data = client .get("https://registry.npmjs.org/react") .send() .unwrap() .text() .unwrap(); let elapsed = now.elapsed(); println!("{}ms", elapsed.as_millis()); }
额外验证
你可以用curl测试压缩对耗时的影响:
- 无压缩请求:
curl -o /dev/null -w "%{time_total}\n" https://registry.npmjs.org/react - 带压缩请求:
curl -H "Accept-Encoding: gzip, br" -o /dev/null -w "%{time_total}\n" https://registry.npmjs.org/react
两者的耗时差异会直接验证压缩的作用。
内容的提问来源于stack exchange,提问作者conaticus
相关产品推荐
相关产品推荐

