我正试图从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