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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:20:36