在Rust中使用reqwest抓取响应标头值 异步/等待阻止API

问题描述

过去几天,我主要在尝试reqwest模块,以了解我可以完成的工作,但是我遇到了一个无法解决的问题。我试图在执行发布请求后检索响应标头值。我尝试过的代码

extern crate reqwest;

fn main() {
   let client = reqwest::Client::new();
   let res = client
    .post("https://google.com")
    .header("testerheader","test")
    .send();
   println!("Headers:\n{:#?}",res.headers().get("content-length").unwrap());
}

代码似乎返回此错误

error[E0599]: no method named `headers` found for opaque type `impl std::future::Future` in the current scope

解决方法

最新的reqwest默认为async,因此在您的示例中,res是未来,而不是实际的响应。您需要await响应或使用reqwest的阻止API。

异步/等待

在您的Cargo.toml中添加tokio作为依赖项。

[dependencies]
tokio = { version = "0.2.22",features = ["full"] }
reqwest = "0.10.8"

使用tokio作为异步运行时,并使用await作为响应。

#[tokio::main]
async fn main() -> Result<(),Box<dyn std::error::Error>> {
    let client = reqwest::Client::new();
    let res = client
        .post("https://google.com")
        .header("testerheader","test")
        .send()
        .await?;
    println!(
        "Headers:\n{:#?}",res.headers().get("content-length").unwrap()
    );
    Ok(())
}

阻止API

在您的Cargo.toml中启用blocking功能。

[dependencies]
reqwest = { version = "0.10.8",features = ["blocking"] }

现在您可以使用Client模块中的reqwest::blocking

fn main() {
    let client = reqwest::blocking::Client::new();
    let res = client
        .post("https://google.com")
        .header("testerheader","test")
        .send()
        .unwrap();
    println!(
        "Headers:\n{:#?}",res.headers().get("content-length").unwrap()
    );
}