0

我试图遵守以下 reqwest 示例:

let client = reqwest::Client::new();
let res = client.post("http://httpbin.org/post")
    .body("the exact body that is sent")
    .send()?;

该示例无法编译:

error[E0277]: the `?` operator can only be applied to values that implement `std::ops::Try`
  --> src/main.rs:26:15
   |
26 |       let res = client.post("http://httpbin.org/post")
   |  _______________^
27 | |     .body("the exact body that is sent")
28 | |     .send()?;
   | |____________^ the `?` operator cannot be applied to type `impl std::future::Future`
   |
   = help: the trait `std::ops::Try` is not implemented for `impl std::future::Future`
   = note: required by `std::ops::Try::into_result`

error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`)
  --> src/main.rs:26:15
   |
11 |  / fn main(){
12 |  |     // gets the api key from env var
13 |  |     let mut key: String = env::var("key").unwrap();
14 |  |     // get the mok key bassically useless but its still useful to prevent tampering
...   |
26 |  |     let res = client.post("http://httpbin.org/post")
   |  |_______________^
27 | ||     .body("the exact body that is sent")
28 | ||     .send()?;
   | ||____________^ cannot use the `?` operator in a function that returns `()`
...   |
49 |  |     //}
50 |  | }
   |  |_- this function should return `Result` or `Option` to accept `?`
   |
   = help: the trait `std::ops::Try` is not implemented for `()`
   = note: required by `std::ops::Try::from_error`

我应该如何解决这个问题?这是过时了吗?我正在使用 Rust 版本 1.47.0

4

1 回答 1

3

根据错误消息,您使用的是异步版本的 reqwest。如果我没记错的话,最新版本包含异步版本和阻塞版本。

为了真正消费future并获得里面的值,你需要使用一个executor来执行它,例如Tokio。这可以通过多种方式完成。

最简单的方法是添加tokio = { version = "0.2.22", features = ["macros"] }到您的 Cargo.toml 中,然后将其放入main.rs

#[tokio::main]
async fn main() {
    let client = reqwest::Client::new();
    let res = client.post("http://httpbin.org/post")
        .body("the exact body that is sent")
        .send().await;
} 

请注意,我删除了 ,?因为未来不会解析为 aResultOption

于 2020-10-13T19:05:30.970 回答