Rust reqwest 代理接入示例
使用 reqwest Proxy、账密认证、异步客户端和超时完成代理请求。
只只HTTP技术团队维护更新于 2026年7月31日
Rust 异步服务可以使用调用方项目自行锁定的 reqwest 和 Tokio。代理认证通过 Proxy 配置,不写入目标请求头。
前置条件
- 调用方项目自行安装并锁定
reqwest与 Tokio。 - 通过受控环境注入
PROXY_HOST、PROXY_PORT、PROXY_USERNAME和PROXY_PASSWORD。 - 为服务设置并发上限和整体请求截止时间。
完整示例
use reqwest::{Client, Proxy};
use std::{env, error::Error, time::Duration};
/// 通过账密代理异步请求公开出口检测地址。
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let proxy_host = env::var("PROXY_HOST")?;
let proxy_port = env::var("PROXY_PORT")?;
let proxy_username = env::var("PROXY_USERNAME")?;
let proxy_password = env::var("PROXY_PASSWORD")?;
let proxy = Proxy::all(format!("http://{proxy_host}:{proxy_port}"))?
.basic_auth(&proxy_username, &proxy_password);
let client = Client::builder()
.proxy(proxy)
.connect_timeout(Duration::from_secs(10))
.timeout(Duration::from_secs(30))
.build()?;
let body = client
.get("https://<public-test-host>/ip")
.send()
.await?
.error_for_status()?
.text()
.await?;
println!("{body}");
Ok(())
}
预期结果
Proxy::all将 HTTP 和 HTTPS 目标统一交给当前 HTTP 代理。- 客户端复用连接,并分别限制连接阶段和整体请求时间。
- 成功状态返回代理出口检测正文。
错误处理
- 407 检查
.basic_auth的代理账密与当前权益。 - 连接和请求超时分别用于定位网络建立阶段与目标响应阶段。
- 只对幂等请求执行带抖动的有限重试。
安全提示
不要使用 Debug 输出 Proxy 或客户端配置。错误上报只携带错误类别、任务标识和脱敏目标主机,不记录代理认证内容。
这篇内容解决了你的问题吗?
反馈只用于改进公开文档,不会提交账号或请求信息。