【问题标题】:Rust reqwest example json code does not compileRust reqwest 示例 json 代码无法编译
【发布时间】:2019-12-06 10:30:30
【问题描述】:

example for dynamic json with reqwest

extern crate reqwest;
extern crate tokio;
extern crate serde_json;  // added to after upgrade to 1.39.0

#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    let echo_json: serde_json::Value = reqwest::Client::new()
        .post("https://jsonplaceholder.typicode.com/posts")
        .json(&serde_json::json!({
            "title": "Reqwest.rs",
            "body": "https://docs.rs/reqwest",
            "userId": 1
        }))
        .send()
        .await?
        .json()
        .await?;

    println!("{:#?}", echo_json);
    // Object(
    //     {
    //         "body": String(
    //             "https://docs.rs/reqwest"
    //         ),
    //         "id": Number(
    //             101
    //         ),
    //         "title": String(
    //             "Reqwest.rs"
    //         ),
    //         "userId": Number(
    //             1
    //         )
    //     }
    // )
    Ok(())
}

使用reqwest = "0.9.22"tokio = "0.2.2" 编译rustc 1.38.0 失败:

   Compiling pin-project-lite v0.1.1
error: `core::slice::<impl [T]>::len` is not yet stable as a const fn
   --> /Users/mick/.cargo/registry/src/github.com-1ecc6299db9ec823/bytes-0.5.2/src/bytes.rs:121:18
    |
121 |             len: bytes.len(),
    |                  ^^^^^^^^^^^

error: aborting due to previous error

error: Could not compile `bytes`.

在下面 Ömer 的评论中通过升级解决了这个问题,但现在下一个问题是

error[E0433]: failed to resolve: could not find `main` in `tokio`
 --> main.rs:5:10
  |
5 | #[tokio::main]
  |          ^^^^ could not find `main` in `tokio`

error[E0277]: the trait bound `std::result::Result<reqwest::Response, reqwest::Error>: std::future::Future` is not satisfied
   --> main.rs:7:40
    |
7   |       let echo_json: serde_json::Value = reqwest::Client::new()
    |  ________________________________________^
8   | |         .post("https://jsonplaceholder.typicode.com/posts")
9   | |         .json(&serde_json::json!({
10  | |             "title": "Reqwest.rs",
...   |
14  | |         .send()
15  | |         .await?
    | |______________^ the trait `std::future::Future` is not implemented for `std::result::Result<reqwest::Response, reqwest::Error>`

error[E0277]: `main` has invalid return type `impl std::future::Future`
 --> main.rs:6:20
  |
6 | async fn main() -> Result<(), reqwest::Error> {
  |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^ `main` can only return types that implement `std::process::Termination`
  |
  = help: consider using `()`, or a `Result`

error: aborting due to 3 previous errors

Some errors have detailed explanations: E0277, E0433.
For more information about an error, try `rustc --explain E0277`.
error: could not compile `webtrekk`.

To learn more, run the command again with --verbose.

还有下一个reqwest = "0.10.0-alpha.2" tokio = { version = "0.2.2", features = ["macros"] } serde_json = "1.0.44"

➜  rust git:(master) ✗ cargo run
    Updating crates.io index
error: failed to select a version for `tokio`.
    ... required by package `reqwest v0.10.0-alpha.2`
    ... which is depended on by `webtrekk v0.1.0 (/Users/mick/repo/webtrekk-client/rust)`
versions that meet the requirements `= 0.2.0-alpha.6` are: 0.2.0-alpha.6

all possible versions conflict with previously selected packages.

  previously selected package `tokio v0.2.2`
    ... which is depended on by `webtrekk v0.1.0 (/Users/mick/repo/webtrekk-client/rust)`

failed to select a version for `tokio` which could resolve this conflict

如何解决这些问题?

【问题讨论】:

  • 看起来很有趣,可能你正在使用 rustc 1.38.0,这不会发生在 1.39.0 上。
  • 是的,确实是1.38.0
  • 升级到 1.39 改变了错误。谢谢!有什么想法吗?
  • 示例是使用 alpha 版本的 tokio,宏捆绑在该版本上,对于稳定版本,您需要启用宏功能:像这样添加您的依赖项tokio = { version = "0.2.2", features = ["macros"] }
  • 和你正在使用的例子,使用 reqwest version = "0.10.0-alpha.2"

标签: rust reqwest


【解决方案1】:

您的示例来自 https://github.com/seanmonstar/reqwest/blob/master/examples/json_dynamic.rs,并与以下 Cargo.toml 一起使用,使用 Rust 1.39:

[package]
name = "reqwest-json_dynamic-example"
version = "0.1.0"
authors = ["fyaa"]
edition = "2018"

[dependencies]
tokio = { version = "=0.2.0-alpha.6", features = ["io", "tcp", "timer"] }
reqwest = { version = "0.10.0-alpha.2", features = ["json"] }
serde_json = "1.0.44"

【讨论】:

  • 太棒了。怎么会有人自己发现这个?有什么有用的文档或命令吗?
  • 因为这是他们存储库中的一个示例,所以我查看了他们的 Cargo.toml 并尝试了他们的一些包(和他们的版本)。然后,我不得不对一些 Cargo 错误做出反应,但它们引导我找到了这个解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-08-13
  • 2015-07-03
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多