rust 为什么get方法没有在reqwest中返回Response对象?

n9vozmp4  于 2022-11-12  发布在  其他
关注(0)|答案(3)|浏览(209)

我尝试从reqwest documentation中复制一个示例。

let body = reqwest::get("https://www.rust-lang.org")?
.text()?;

在Cargo.toml文件中添加了reqwest = "0.10.10"行之后,我在main.rs文件中添加了以下代码:

extern crate reqwest;

fn main() {
    let body = reqwest::get("https://www.rust-lang.org")?.text()?;
    println!("body = {:?}", body);
}

此代码不编译并返回以下错误:

cannot use the `?` operator in a function that returns `()`

我对这种行为有点惊讶,因为我的代码几乎是 ipsis litteris 文档代码。
我认为?只适用于Response对象,所以我检查了get方法返回的是哪个对象:

extern crate reqwest;

fn print_type_of<T>(_: &T) {
    println!("{}", std::any::type_name::<T>())
}

fn main() {
    let body = reqwest::get("https://www.rust-lang.org");
    print_type_of(&body);
}

输出:

core::future::from_generator::GenFuture<reqwest::get<&str>::{{closure}}

我的意思是,为什么我没有得到一个Response对象,就像文档一样?

roqulrg3

roqulrg31#

这里有两个不同的问题绊倒你。
您链接到的文档是针对reqwest版本0.9.18的,但您安装的是0.10.10版本。

let body = reqwest::get("https://www.rust-lang.org")
    .await?
    .text()
    .await?;

println!("body = {:?}", body);

或者在您的情况下更有可能,因为您没有提到异步运行时the blocking docs

let body = reqwest::blocking::get("https://www.rust-lang.org")?
    .text()?;

println!("body = {:?}", body);

请注意,当您尝试使用此选项时,您 * 仍然 * 会得到
不能在返回()的函数中使用?运算符
并且您需要在main上设置一个返回类型,如

fn main() -> Result<(), reqwest::Error> {

有关详细信息,请参阅Why do try!() and ? not compile when used in a function that doesn't return Option or Result?

jum4pzuy

jum4pzuy2#

您可能需要阅读Rust文档的以下部分:https://doc.rust-lang.org/edition-guide/rust-2018/error-handling-and-panics/index.html
简而言之,?只是通过隐式return将错误从Result传递到调用堆栈的更上层。因此,使用?运算符的函数必须返回与使用?的函数相同的类型。

hkmswyz6

hkmswyz63#

每个响应都被 Package 在一个可以展开的Result类型中。

use reqwest;

    #[tokio::main]
    async fn main() {

        let response = reqwest::get("https://www.rust-lang.org")
            .await
            .unwrap()
            .text()
            .await;
        println!("{:?}", response);
    }

Cargo.toml:

[package]
name = "request"
version = "0.1.0"
edition = "2021"
reqwest = "0.10.10"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
reqwest = { version = "0.11", features = ["json"] } # reqwest with JSON parsing support
futures = "0.3" # for our async / await blocks
tokio = { version = "1.12.0", features = ["full"] } # for async runtime

相关问题