如何将serde_json::error::Error转换为reqwest::error::Error?

8

reqwest v0.9的依赖是serde v1.0,因此实现了将serde_json错误转换为reqwest错误的功能。

在我的代码中,我使用serde_json进行反序列化,而不是使用reqwest自带的.json()方法。

// reqwest = "0.9"
// serde = { version = "1.0", features = ["derive"] }
// serde_json = "1.0"

pub fn get_meta(client: &reqwest::Client) -> Result<Meta, reqwest::Error> {
    let mut resp = client
        .get("http://localhost:8080/requests/playlist.json")
        .send()?;

    let data: Value = serde_json::from_str(&resp.text()?).unwrap();
    let data = data["children"][0]["children"].clone();
    let metas: Vec<Meta> = serde_json::from_value(data).unwrap();
    let meta: Meta = metas.last().expect("nothing is playing").clone();
    Ok(meta)
}

目前,我正尝试将serde_json的错误返回为reqwest的错误。将let metas: Vec<Meta> = serde_json::from_value(data).unwrap();更改为let metas: Vec<Meta> = serde_json::from_value(data)?;会导致以下错误:

 the trait `std::convert::From<serde_json::error::Error>` is not implemented for `reqwest::error::Error`

我可以通过将serde_json :: error :: Error包装在reqwest :: error :: ErrorKind :: Json错误枚举中来转换吗?还是我必须创建一个自定义错误枚举,如本文章中所提到的,来涵盖两者?


1
reqwest::Error 类型是 reqwest crate 的内部错误类型。它不公开任何公共构造函数或 From 实现,实例只能从 reqwest crate 内部构造。因此简短的答案是:不能将任何其他类型转换为 reqwest::Error,需要使用其他错误类型。 - Sven Marnach
1个回答

6

不可以构建reqwest::Error值,因为它具有以下特点:

  • 具有非公共字段
  • 没有公共构造函数
  • 没有针对公共类型的From实现

幸运的是,reqwest::Errorserde_json::error::Error都实现了std::error::Error trait。根据您提供的博客文章的建议,这里的anyhow crate非常有用:

// reqwest = "0.9"
// serde = { version = "1.0", features = ["derive"] }
// serde_json = "1.0"
// anyhow = "1.0"

pub fn get_meta(client: &reqwest::Client) -> Result<Meta, anyhow::Error> {
    let mut resp = client
        .get("http://localhost:8080/requests/playlist.json")
        .send()?;

    let data: Value = serde_json::from_str(&resp.text()?).unwrap();
    let data = data["children"][0]["children"].clone();
    let metas: Vec<Meta> = serde_json::from_value(data).unwrap();
    let meta: Meta = metas.last().expect("nothing is playing").clone();
    Ok(meta)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接