rust 如何创建一个阻塞请求客户端?

68bkxrlz  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(175)

使用https://docs.rs/reqwest/latest/reqwest/blocking/struct.ClientBuilder.html中的代码

use reqwest;
use std::time::Duration;

let client = reqwest::blocking::Client::builder()
    .timeout(Duration::from_secs(10))
    .build()?;

我的货物.toml

reqwest = { version = "0.11.13", features = ["blocking", "json"] }

但我得到错误:

error[E0277]: the `?` operator can only be used in a method that returns `Result` or `Option` (or another type that implements `FromResidual`)
  --> src/main.rs:27:13
   |
22 | /     fn new(&self) {
23 | |         //self.client = reqwest::blocking::Client::builder().build()?;
24 | |
25 | |         let client = reqwest::blocking::Client::builder()
26 | |     .timeout(Duration::from_secs(10))
27 | |     .build()?;
   | |             ^ cannot use the `?` operator in a method that returns `()`
28 | |     }
   | |_____- this function should return `Result` or `Option` to accept `?`
   |
   = help: the trait `FromResidual<Result<Infallible, reqwest::Error>>` is not implemented for `()`

"有什么想法吗"

xmq68pz9

xmq68pz91#

Rust中的?操作符接受一个Result<T, E>值,如果是错误,则将其传播给调用者,否则将其展开。
你可以想到

let client = something.builder()?;

大致相当于

let client = match something.builder {
  Ok(inner_value) => {
    inner_value
  }
  Err(error) => {
    return Err(error);
  }
};

现在build在您的例子中 * 确实 * 返回Result,但是您的包含new的函数 * 不 * 返回,所以您试图从返回()的函数返回一个错误。名为new的函数可能应该构造一个对象,而不是返回(),但这是另一个问题)
所以要么让你的函数返回Result<..., E>,以得到与错误类型build兼容的E(“兼容”意味着“存在一个impl From<E> for E1,从它的类型到你的类型”),要么用其他方法处理错误。
如果您有可以返回的默认值,则可以使用unwrap_orunwrap_or_else执行此操作

let client = something.builder().unwrap_or_else(|| some_appropriate_default());

也可以使用expect显式死机。

let client = something.builder().expect("Something horrible happened! Plz debug!");

相关问题