7

我正在尝试使用 reqwest 库并遵循我在网上各个地方找到的模式来发帖:

let res = http_client.post(&url)
                          .header("Content-Type", "application/x-www-form-urlencoded")
                          .form(&form_data)
                          .send()
                          .await?;
println!("authenticate response: {}", res.status)

上面的代码块导致编译错误:

`?` couldn't convert the error to `std::io::Error` the trait ` 
      `std::convert::From<reqwest::error::Error>` is not implemented for `std::io::Error`

我不明白为什么会收到此错误。我已经使我的代码尽可能接近示例。?如果我删除和,它将编译res.status。但我需要获取状态res.status值。更重要的是,我需要了解我错过了什么或做错了什么。

4

1 回答 1

7

您的错误是由调用此块的函数的返回类型引起的,编译器希望返回 type 的错误std::io::Error

从错误描述中,我得出结论您的main函数看起来像这样:

fn main() -> Result<(), std::io::Error> {
    // ...
}

问题是 reqwest 不返回io::Error. 这是我几个月前写的一个片段:

use exitfailure::ExitFailure;

fn main() -> Result<(), ExitFailure> {
    let res = http_client
        .post(&url)
        .header("Content-Type", "application/x-www-form-urlencoded")
        .form(&form_data)
        .send()
        .await?;

    println!("authenticate response: {}", res.status);
    Ok(())
}

我使用exitfailure将返回的错误类型转换为人类可读的返回类型main。我想它也会解决你的问题。

更新: 评论中指出,exifailure 已弃用依赖项,这可以在没有外部 crate 的情况下实现。有一种返回封装动态错误的推荐方法:Box<dyn std::error::Error>

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let res = http_client
        .post(&url)
        .header("Content-Type", "application/x-www-form-urlencoded")
        .form(&form_data)
        .send()
        .await?;

    println!("authenticate response: {}", res.status);
    Ok(())

}

从我可以看到返回错误的行为main是相同的。

于 2020-06-09T02:06:04.077 回答