Reqwest: Rust HTTPクライアントライブラリ

Reqwest は高レベルなHTTPクライアントライブラリで、HTTPリクエストの処理を簡素化し、多くの便利な機能を提供します:

  • 非同期および同期(ブロッキング)APIのサポート
  • 様々なリクエストボディの処理:プレーンテキスト、JSON、URLエンコードフォーム、マルチパートフォーム
  • カスタマイズ可能なリダイレクトポリシー
  • HTTPプロキシサポート
  • デフォルトでのTLS暗号化
  • Cookie管理

基本的な使い方

GETリクエストの送信

単一のリクエストには、get ショートカットメソッドを使用できます:

let body = reqwest::get("https://www.rust-lang.org")
    .await?
    .text()
    .await?;

println!("body = {body:?}");

注意:複数のリクエストを実行する予定がある場合は、Client を作成して再利用し、コネクションプールの利点を活かすことをお勧めします。

let client = reqwest::Client::new();
let res = client.get("https://www.rust-lang.org")
    .send()
    .await?;

POSTリクエストの送信

body() メソッドを使用してリクエストボディを設定できます:

let client = reqwest::Client::new();
let res = client.post("http://httpbin.org/post")
    .body("送信する具体的な内容")
    .send()
    .await?;

フォームデータ

フォームデータの送信は一般的な要件であり、フォームデータにシリアライズ可能な任意の型を使用できます:

// これは `foo=bar&baz=quux` というボディを持つPOSTリクエストを送信します
let params = [("foo", "bar"), ("baz", "quux")];
let client = reqwest::Client::new();
let res = client.post("http://httpbin.org/post")
    .form(&params)
    .send()
    .await?;

JSONデータ

json メソッドを使用すると、簡単にJSONデータを送信できます(json 機能が必要です):

// これは `{"lang":"rust","body":"json"}` というボディを持つPOSTリクエストを送信します
let mut map = HashMap::new();
map.insert("lang", "rust");
map.insert("body", "json");

let client = reqwest::Client::new();
let res = client.post("http://httpbin.org/post")
    .json(&map)
    .send()
    .await?;

レスポンスの処理

レスポンスは様々な方法で処理できます:

let res = client.get("https://www.rust-lang.org").send().await?;

// ステータスコードの取得
let status = res.status();

// レスポンスヘッダーの取得
let content_type = res.headers().get("content-type").unwrap();

// レスポンスボディをテキストとして読み取る
let body = res.text().await?;

// またはJSONとしてパースする
let json: serde_json::Value = res.json().await?;

高度な機能

リダイレクトポリシー

デフォルトでは、クライアントは最大10回のリダイレクトを自動的に処理します。ClientBuilder を使用してこの動作をカスタマイズできます:

let custom_client = reqwest::Client::builder()
    .redirect(reqwest::redirect::Policy::none()) // リダイレクトを無効化
    .build()?;

Cookieサポート

ClientBuilder を使用して、セッションCookieの自動保存と送信を有効にできます:

let client = reqwest::Client::builder()
    .cookie_store(true)
    .build()?;

プロキシ設定

システムプロキシはデフォルトで有効になっており、環境変数からHTTPまたはHTTPSプロキシ設定を検索します:

  • HTTP_PROXY または http_proxy:HTTP接続用のプロキシ
  • HTTPS_PROXY または https_proxy:HTTPS接続用のプロキシ
  • ALL_PROXY または all_proxy:両方の接続用のプロキシ

コードで明示的にプロキシを設定することもできます:

let proxy = reqwest::Proxy::http("https://secure.example")?;
let client = reqwest::Client::builder()
    .proxy(proxy)
    .build()?;

// またはプロキシを無効化
let client = reqwest::Client::builder()
    .no_proxy()
    .build()?;

TLS設定

クライアントはデフォルトでTLSを使用してHTTPSターゲットに接続します:

// 追加のサーバー証明書を追加
let cert = reqwest::Certificate::from_pem(&cert_bytes)?;
let client = reqwest::Client::builder()
    .add_root_certificate(cert)
    .build()?;

// クライアント証明書を設定
let identity = reqwest::Identity::from_pkcs12_der(&pkcs12_der, "password")?;
let client = reqwest::Client::builder()
    .identity(identity)
    .build()?;

タイムアウト設定

リクエストにタイムアウトを設定できます:

let client = reqwest::Client::builder()
    .timeout(std::time::Duration::from_secs(10))
    .build()?;

オプション機能

Reqwestは、Cargoの機能を通じて有効または無効にできる様々なオプション機能を提供します:

  • http2(デフォルトで有効):HTTP/2のサポート
  • default-tls(デフォルトで有効):HTTPS用のTLSサポートを提供
  • rustls-tls:rustlsを使用したTLS機能を提供
  • blocking:同期(ブロッキング)クライアントAPIを提供
  • json:JSONのシリアライズとデシリアライズ機能を提供
  • multipart:マルチパートフォーム機能を提供
  • cookies:Cookieセッションサポートを提供
  • gzipbrotlideflatezstd:様々なレスポンスボディの解凍をサポート
  • socks:SOCKS5プロキシサポートを提供

同期(ブロッキング)API

非同期操作が必要ない場合は、同期APIを使用できます(blocking 機能が必要です):

let body = reqwest::blocking::get("https://www.rust-lang.org")?.text()?;

let client = reqwest::blocking::Client::new();
let res = client.post("http://httpbin.org/post")
    .json(&map)
    .send()?;