You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的压缩特性

  1. 修改Cargo.toml,添加reqwest的压缩相关特性:
# 异步客户端
reqwest = { version = "0.11", features = ["tokio-rustls", "gzip", "brotli"] }
# 阻塞客户端
reqwest = { version = "0.11", features = ["blocking", "gzip", "brotli"] }
  1. 构建客户端时启用自动压缩:
    异步版本修改后代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:22:13