Получение значения заголовка ответа с помощью reqwest в rust

#rust #reqwest

#Ржавчина #reqwest

Вопрос:

В течение последних нескольких дней я в основном экспериментировал с модулем reqwest, чтобы посмотреть, чего я могу достичь, но я столкнулся с определенной проблемой, которую я не смог решить. Я пытаюсь получить значение заголовков ответа после выполнения запроса post. Код, в котором я пытался, является

 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
  

Ответ №1:

Последнее значение по умолчанию 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()
    );
}