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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:32:26