Rust reqwest实现Python requests基础认证GET请求遇连接错误求解决
解决reqwest发起带Basic Auth请求时的"unsuccessful tunnel"错误
1. 确认URL协议一致性
错误信息中显示实际请求的URL是HTTPS(scheme: "https"),但你的Rust代码里写的是HTTP协议的URL。服务器可能强制将HTTP请求跳转至HTTPS,导致隧道建立失败。
把代码中的URL改为HTTPS:
use reqwest; #[tokio::main] async fn main() -> Result<(), reqwest::Error> { let url = "https://myurl.com/myapi"; let response = reqwest::Client::builder() .danger_accept_invalid_certs(true) .build()? .get(&url) .basic_auth("username", Some("password")) .send() .await?; Ok(()) }
2. 处理代理配置
如果你的环境使用了系统代理,reqwest可能无法正确处理代理隧道,尤其是当目标服务器证书不受信任时。可以尝试禁用代理:
let response = reqwest::Client::builder() .danger_accept_invalid_certs(true) .no_proxy() // 禁用代理 .build()? .get(&url) .basic_auth("username", Some("password")) .send() .await?;
如果需要使用代理,需显式配置代理地址,并确保代理允许访问目标服务器:
use reqwest::Proxy; let proxy = Proxy::http("http://your-proxy:port")?; let response = reqwest::Client::builder() .danger_accept_invalid_certs(true) .proxy(proxy) .build()? .get(&url) .basic_auth("username", Some("password")) .send() .await?;
3. 手动构造Basic Auth头
如果basic_auth方法存在隐式问题,可以手动构造Authorization头:
use base64::{engine::general_purpose, Engine as _}; use reqwest::header::{HeaderMap, AUTHORIZATION}; let auth_str = format!("{}:{}", "username", "password"); let auth_b64 = general_purpose::STANDARD.encode(auth_str); let mut headers = HeaderMap::new(); headers.insert(AUTHORIZATION, format!("Basic {}", auth_b64).parse()?); let response = reqwest::Client::builder() .danger_accept_invalid_certs(true) .default_headers(headers) .build()? .get(&url) .send() .await?;
注意:需要在Cargo.toml中添加base64依赖:
[dependencies] reqwest = { version = "0.11", features = ["json", "native-tls"] } tokio = { version = "1.0", features = ["full"] } base64 = "0.21"
4. 完善错误排查
去掉unwrap()改用?来捕获完整错误信息,同时打印响应状态或更多细节:
match reqwest::Client::builder() .danger_accept_invalid_certs(true) .build() { Ok(client) => { match client.get(&url).basic_auth("username", Some("password")).send().await { Ok(resp) => println!("Response status: {}", resp.status()), Err(e) => eprintln!("Full error details: {:?}", e), } }, Err(e) => eprintln!("Client build error: {:?}", e), }
内容的提问来源于stack exchange,提问作者trozzel
相关产品推荐
相关产品推荐

