为什么get方法不返回reqwest中的Response对象



我正试图从reqwest文档中复制一个示例。以下是示例:

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 `()`

我对这种行为感到有点惊讶,因为我的代码几乎是文档代码的

我认为?只适用于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}}

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

这里有两个单独的问题会让您感到困惑。

您链接到的文档适用于reqwest版本0.9.18,但您已安装版本0.10.10。如果你查看0.10.10的文档,你会发现你使用的代码段是

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

或者更可能在您的情况下,由于您没有提到有异步运行时,blocking文档

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

注意,当你尝试使用这个时,你会仍然得到

不能在返回()的函数中使用?运算符

,您需要在main上设置一个返回类型,如

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

看看为什么要尝试!((和?在函数中使用时不编译;t return Option or Result?了解更多信息。

您可能想阅读Rust文档的这一部分:https://doc.rust-lang.org/edition-guide/rust-2018/error-handling-and-panics/index.html

简而言之,?只是通过隐式return将来自Result的错误进一步向上传递到调用堆栈。因此,使用?运算符的函数必须返回与使用?的函数相同的类型。

每个响应都封装在一个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

相关内容

  • 没有找到相关文章

最新更新