Как установить заголовки запроса с помощью Reqwest?

Мне нужно сделать запрос GET на веб-сайт с файлом cookie, используя библиотеку Reqwest. Я понял, как отправить запрос GET:

let response = reqwest::get("http://example.com")?;

Как отправить тот же запрос, но добавить несколько пользовательских заголовков?


person serge1peshcoff    schedule 20.12.2017    source источник


Ответы (2)


Reqwest 0,10

Начиная с документации ящика, мы видим:

Для одного запроса вы можете использовать метод быстрого доступа get.

В документации get говорится:

Эта функция создает новый внутренний Client при каждом вызове, поэтому ее не следует использовать при выполнении большого количества запросов. Вместо этого создайте Client.

Client имеет метод request, который гласит:

Возвращает RequestBuilder, что позволяет установить заголовки и тело запроса перед отправкой.

RequestBuilder имеет header метод. Это можно использовать как:

use reqwest::header::USER_AGENT;

let client = reqwest::Client::new();
let res = client
    .get("https://www.rust-lang.org")
    .header(USER_AGENT, "My Rust Program 1.0")
    .send()
    .await?;

Как добавить собственные заголовки?

Если вы посмотрите на подпись для header, вы увидите, что он принимает общие типы:

pub fn header<K, V>(self, key: K, value: V) -> RequestBuilder where
    HeaderName: TryFrom<K>,
    <HeaderName as TryFrom<K>>::Error: Into<Error>,
    HeaderValue: TryFrom<V>,
    <HeaderValue as TryFrom<V>>::Error: Into<Error>, 

Существует реализация TryFrom<&'a str> для HeaderName, поэтому вы можете использовать строковый литерал:

use reqwest; // 0.10.0
use tokio; // 0.2.6

#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    let client = reqwest::Client::new();
    let res = client
        .get("https://www.rust-lang.org")
        .header("X-My-Custom-Header", "foo")
        .send()
        .await?;

    Ok(())
}
person Shepmaster    schedule 20.12.2017
comment
Спасибо за глубокое копание. Это действительно должно быть более четко указано в документации. - person the_lrner; 03.07.2020
comment
Также теперь можно добавить несколько заголовков с помощью .headers () вместо .header () и разрешить mut headers = reqwest :: header :: HeaderMap :: new (); headers.insert (reqwest :: header :: USER_AGENT, reqwest :: header :: HeaderValue :: from_static (curl)); - person cloudsurfin; 11.10.2020

Отправить cookie в клиенте reqwest с версией ~ 0.9.19

use reqwest; // 0.9.19
use http::{HeaderMap, HeaderValue, header::{COOKIE}};

// create client first
let init_client = reqwest::Client::builder()
        .cookie_store(true).build().unwrap();
// create Header Map
// Here cookie store is optional based on if making more than one request with the // same client 
let mut headers = HeaderMap::new();
headers.insert(COOKIE, HeaderValue::from_str("key=value").unwrap());
let resp = init_client.get("api")
           .headers(headers)
           .query(&[("name", "foo")])
           .send()
           .map(|resp|{
               println!("{:?}", resp.status());
               resp
           })
           .map_err(|err|{
              println!("{:?}", err);
              err
           });

Надеюсь, это поможет.

person Abrar Khan    schedule 04.09.2019