Actix

Actix Web v4 ハンドラ基本構文と非同期処理の完全ガイド

ⓘ本ページはプロモーションが含まれています

スポンサードリンク

Actix Web v4 のハンドラ基本構文

Actix Web v4 では、非同期ハンドラを async fn として定義し、戻り値に impl Responder を指定します。この書き方は最もシンプルでありながら型安全で、テストもしやすくなります。本節では「シンプルなハンドラの書き方」と「独自抽出器を作るための FromRequest 実装」の2つのポイントを中心に解説します。

async fn と impl Responder のシンプルな例

  • #[get(...)] マクロはルーティング情報を付与します。
  • 関数本体は普通の非同期コードなので、await が必要な処理もそのまま書けます。
  • 戻り値が文字列の場合、Actix の内部で HttpResponse::Ok().body(..) に変換されます。

FromRequest トレイトの概要とカスタム抽出器の作り方

Actix は FromRequest を実装した型をハンドラ引数として受け取ります。標準では Path<T>, Query<T>, Json<T> が提供されていますが、独自ロジックが必要なときはカスタム抽出器を作成できます。

カスタム抽出器の実装例(エラーハンドリングを改善)

  • to_str() の結果は必ずチェックし、unwrap_or_default() に依存しないようにしています。
  • エラーはすべて ErrorBadRequest(400 Bad Request)で統一し、実運用時に panic が起きるリスクを排除しました。


リクエスト抽出器(Path, Query, Json)の実践的使用法

Path, Query, Json は型安全にリクエストデータを取得できる標準抽出器です。ここでは「複数パラメータの受け取り」「バリデーションとエラーハンドリング」の具体例を示します。

Path と Query の型安全な取得例

  • Path<(u32,)> のようにタプルで受け取ると、複数のパス変数をまとめて取得できます。
  • Query<T> は URL エンコードされたクエリ文字列を自動的にデシリアライズし、型チェックが走ります。

Json ペイロードのバリデーションとエラーハンドリング

  • validator クレートを併用すると、フィールド単位の検証ロジックが簡潔に書けます。
  • バリデーション失敗時はエラーメッセージを JSON で返すことでクライアント側の実装が楽になります。

非同期データベース呼び出しと統一的エラーハンドリング

Actix Web のハンドラは async が前提なので、非同期対応 ORM/ドライバ(例: sqlx, sea‑orm)をそのまま await できます。さらに、エラー型をカスタマイズし ResponseError を実装すれば、HTTP ステータスコードとメッセージを一元管理できます。

sqlx を用いた async DB クエリの実装パターン

  • web::Data<PgPool> はアプリ全体で共有できるコネクションプールです。
  • query_as! マクロはコンパイル時に SQL の型チェックを行うため、実行時エラーが減ります。

ResponseError を実装したカスタムエラーで Result を Propagate する方法

  • Result<impl Responder, ApiError> と書くことで、? 演算子でエラーを自動的にハンドラ外へ伝搬できます。
  • ResponseError 実装により、ステータスコードとレスポンスボディが一元管理でき、テスト時の期待値設定も楽になります。

ブロッキング処理の安全なオフロード

CPU バウンドや同期 I/O(例: 既存の Diesel 同期クエリ)を非同期ハンドラから直接呼び出すと、Actix のスレッドプールがブロックされて全体性能が低下します。web::block を使えば、安全に別スレッドへオフロードできます。

web::block を利用した CPU バウンド処理の切り離し

  • web::block は内部でブロッキング用スレッドプール(デフォルトは actix_rt::System のブロッキングスレッド)を使用し、呼び出し元の非同期タスクは即座に復帰します。
  • エラーは await 時点で Result にラップされるので、ハンドラ側では普通に match すれば OKです。

ハンドラの単体テストとプロジェクト設定

実務ではコード変更時にハンドラ単体テストを走らせることで不具合を早期発見できます。Actix はテスト用ユーティリティ actix_web::test を提供しており、モックリクエストの作成やレスポンス検証が簡潔に書けます。また、プロジェクト全体の Cargo 設定例も合わせて示します。

actix_web::test でモックリクエストを作成しハンドラを検証

  • test::init_service でハンドラだけを組み込んだ最小構成のアプリケーションを作ります。
  • TestRequest によりメソッド・URI・ボディなど自由に設定でき、実際のクライアントリクエストと同等です。
  • read_body が返す bytes::Bytes は UTF‑8 と仮定してデコードするか、直接 JSON デシリアライズして検証できます。

Cargo.toml の推奨設定(TLS 実装は rustls に統一)

設定のポイント

項目 推奨設定 理由
edition "2021" 最新コンパイラ機能と安全な非同期コードが利用可能
Actix の TLS 実装 features = ["rustls"] OpenSSL に依存せず、クロスプラットフォームで軽量
sqlx の runtime と TLS "runtime-tokio-rustls" Tokio と rustls が統一され、ビルドがシンプル
バリデーション validatorderive 機能 構造体に直接バリデーションロジックを付与できる

この設定例は Actix Web v4 と Rust 2021 エディションの組み合わせで、CI 環境やローカル開発でも問題なくビルドできます。


まとめ

  • シンプルなハンドラasync fn -> impl Responder で実装し、テストが容易です。
  • カスタム抽出器 を作るときは必ずヘッダー文字列の変換エラーをチェックし、unwrap に頼らない実装にしましょう。
  • データベースアクセスResult<_, ApiError> として統一的にエラーハンドリングし、ResponseError で HTTP ステータスと JSON メッセージを一本化します。
  • ブロッキング処理web::block で安全にオフロードし、サーバ全体のスループット低下を防ぎます。
  • 単体テストactix_web::test を活用してハンドラ単位で検証し、CI パイプラインに組み込むことで品質を保ちます。

以上のベストプラクティスを取り入れれば、Actix Web アプリケーションは安全・高速・保守性の高いコードベースになるでしょう。

スポンサードリンク

-Actix