Rust中使用reqwest处理HTTP响应错误的实现方案咨询
解决方案
以下是修改后的代码,实现了仅在有效响应时执行反序列化的逻辑,同时保留了错误处理的灵活性:
use clap::Parser; use serde::{Deserialize, Serialize}; use std::error::Error; #[tokio::main] async fn main() -> Result<(), Box<dyn Error>> { let args: Cli = Cli::parse(); let client = reqwest::Client::new(); let countries = vec!["FR", "GB", "DE", "US"]; for country in countries.iter() { let url = format!( "http://example-service.com/countries/{}/customers/{}/foo_bar", country, args.customer_number ); // 先获取完整响应对象,便于检查状态码 let response = client.get(&url).send().await?; if response.status().is_success() { // 仅在响应成功时尝试反序列化 match response.json::<FooBar>().await { Ok(foo_bar) => println!("{}: {}", country, foo_bar.a_value), Err(e) => eprintln!("{} 数据解析失败: {}", country, e), } } else { eprintln!("{} 请求失败,状态码: {}", country, response.status()); } } Ok(()) } #[derive(Debug, Serialize, Deserialize)] struct FooBar { a_value: String, } #[derive(Parser, Debug)] struct Cli { customer_number: i32, }
关键改动说明
- 拆分响应处理流程:不再链式调用
.json().await?,而是先获取Response对象,这样可以先校验响应状态是否正常 - 状态码校验:通过
response.status().is_success()判断是否为2xx成功响应,只有成功时才尝试反序列化 - 容错式反序列化:用
match处理json()的结果,反序列化失败时仅打印错误信息,不会导致整个程序终止 - 统一错误类型:将
main函数的返回类型改为Result<(), Box<dyn Error>>,这样可以同时处理reqwest的网络错误和serde的反序列化错误
这样修改后,你的CLI工具会跳过无效响应,继续处理其他国家的请求,同时清晰地输出错误信息便于调试。
内容的提问来源于stack exchange,提问作者habjo
相关产品推荐
相关产品推荐

