Rust使用reqwest发送POST请求返回类型错误问题咨询
问题原因分析
- 你自行定义了
Result枚举,覆盖了Rust标准库的std::result::Result,reqwest库的返回结果使用的是标准库Result,首先就存在类型冲突,完全不需要自定义该枚举。 reqwest的send()方法返回的是impl Future类型,不是直接的结果枚举,你没有加.await就直接对Future做match,必然会报类型不匹配,Future必须经过await才能拿到最终的Result结果。- match分支逻辑错误:Ok分支返回Response类型值,Err分支返回错误类型值,两个分支返回值类型不一致,也和函数声明的返回值
Result<(), ()>完全不匹配。 - 函数用到了异步调用逻辑,声明为async是正确的,这个不需要怀疑。
修复方案
- 删除自定义的Result枚举,直接使用Rust标准库的Result,也可以直接用reqwest自带的Result别名简化代码。
- 调用
send()之后必须追加.await,才能拿到请求的最终结果枚举。 - 修正match分支的返回逻辑,保证两个分支返回值类型统一,且和函数声明的返回类型匹配。如果只需要判断请求是否成功,成功返回
Ok(()),失败返回Err(())即可;更推荐透传reqwest的错误,方便后续排查问题。 - 如果要透传reqwest错误,直接把函数返回值改为
Result<(), reqwest::Error>即可,不需要额外做错误转换。
修正后的示例代码
最简写法(用?自动处理错误):
// 直接使用reqwest自带的Result别名,已默认封装错误类型为reqwest::Error pub async fn make_request(path: &str) -> Result<(), reqwest::Error> { let client = reqwest::Client::new(); // send后加await拿到请求结果,?运算符自动处理错误,出错直接返回Err let _res = client.post(format!("http://localhost:8000/{}", path)) .body("tbd") .send() .await?; // 不需要返回响应内容时直接返回Ok(()) Ok(()) }
需要手动match处理错误的写法:
pub async fn make_request(path: &str) -> Result<(), ()> { let client = reqwest::Client::new(); let request_result = client.post(format!("http://localhost:8000/{}", path)) .body("tbd") .send() .await; match request_result { Ok(_res) => Ok(()), Err(_err) => Err(()), } }
额外注意点
- 调用该
make_request异步函数的位置,也必须处于async上下文中,并且需要加.await才能正常执行。 - 如果需要获取响应正文,可以在拿到Response对象后,继续调用
.text().await或者.json::<T>().await完成解析。
内容的提问来源于stack exchange,提问作者AMP_035
相关产品推荐
相关产品推荐

