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(¶ms)
.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セッションサポートを提供
gzip、brotli、deflate、zstd:様々なレスポンスボディの解凍をサポート
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()?;