web-dev-qa-db-ja.com

Reqwestを使用してリクエストヘッダーを設定するにはどうすればよいですか?

Reqwestライブラリを使用してCookieを使用してWebサイトにGETリクエストを行う必要があります。 GETリクエストを送信する方法を理解しました。

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

同じリクエストを送信しますが、カスタムヘッダーを追加するにはどうすればよいですか?

10
serge1peshcoff

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>, 

HeaderNameに対するTryFrom<&'a str>の実装 があるため、文字列リテラルを使用できます。

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(())
}
14
Shepmaster

バージョン〜0.9.19のreqwestクライアントでCookieを送信する

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
           });

これが役立つことを願っています。

1
Abrar Khan