使用reqwest 0.11传密钥添加基础授权头报缺失认证凭证,该如何解决?
现有依赖配置
reqwest = { version = "0.11", features = ["json"] }
当前Client初始化实现代码:
impl Client { pub fn new(/*endpoint: Url*/) -> Result<Client> { Ok(Client { client: reqwest::ClientBuilder::new().build()?, }) } }
当前发起请求的存在问题的代码:
let res = self .client .post(url) .header("Content-type", "application/x-www-form-urlencoded") .header("Authorization", "Basic".to_owned() + &secret) .send .await?; let data = res.json::<Response>().await?;
代码核心问题定位
- 发起请求时漏写
send方法的调用括号:.send是方法引用本身,并非执行后的异步任务,需要补全为.send() - 手动拼接
Authorization头不符合HTTP Basic Auth规范:Basic标识和后续Base64编码的凭证串之间必须保留一个空格,当前代码直接将"Basic"和secret字符串拼接,服务端无法识别有效鉴权内容 - 未使用reqwest内置的鉴权封装方法,手动拼接容易出现格式疏漏
正确实现方式
方案1:使用reqwest内置基础鉴权方法(推荐)
reqwest 0.11原生提供了basic_auth封装方法,自动处理Base64编码、请求头格式拼接,无需手动处理编码逻辑:
let res = self .client .post(url) .header("Content-type", "application/x-www-form-urlencoded") // 分别传入鉴权用户名、密码参数 .basic_auth("你的用户名", "你的密码") .send() .await?; let data = res.json::<Response>().await?;
如果你的secret是已经完成Base64编码的整串凭证,可以将其按分隔逻辑拆分出用户名和密码段后传入上述方法
方案2:手动拼接鉴权头
如果需要自定义拼接逻辑,必须严格遵循格式要求:
// 注意:Basic 和 凭证串之间必须保留一个空格 let auth_value = format!("Basic {}", secret); let res = self .client .post(url) .header("Content-type", "application/x-www-form-urlencoded") .header("Authorization", auth_value) .send() .await?; let data = res.json::<Response>().await?;
内容的提问来源于stack exchange,提问作者sum91
相关产品推荐
相关产品推荐

