Contents
Actix Web入門ガイド:Rust新規開発者向けの実践的解説
Actix Webは、Rust言語でWebアプリケーションを開発する際の信頼性とパフォーマンスを追求したフレームワークとして注目されています。特に、非同期処理を効率的に扱える点が特徴で、APIサーバーや高負荷なWebサービスの開発に適しています。本記事では、Rust初心者~中級者がCargoプロジェクトからローカル環境での動作確認までをステップバイステップで解説します。Actix Webの特徴とAxumなど他のフレームワークとの比較も含め、実践的な入門ガイドを目指します。
Actix Webの特徴とAxumとの主な違い
Actix WebはRustコミュニティで幅広く利用されており、軽量かつ高パフォーマンスな処理が可能です。一方のAxumは、Tokioを基盤としたフレームワークであり、非同期処理の扱いやすさが強みです。
| 項目 | Actix Web | Axum |
|---|---|---|
| 非同期サポート | 高度なasync/awaitサポート | デフォルトでTokioベース |
| パフォーマンス | 低レイテンシーの高パフォーマンスを実現 | 並列処理に最適化された設計 |
| 学習曲線 | 静的な構造が特徴(Rust初心者にも親しみやすい) | モジュール構成が複雑(上級者向けに感じる) |
選ぶ際は、アプリケーションの用途と開発者スキルに応じてフレームワークを選びましょう。Actix Webは特にAPIサーバー向けに適しているとされています。
Cargoプロジェクトの初期設定方法
RustでWebアプリケーションを開発するには、まずCargoプロジェクトを作成し、必要な依存関係を追加します。このステップでは、開発環境のセットアップからActix Webライブラリの導入までを解説します。
新規プロジェクト作成手順
-
ターミナルで以下のようにコマンドを実行します
bash
cargo new actix_web_sample --bin
cd actix_web_sample -
プロジェクト構造が生成されます
actix_web_sample/
├── Cargo.toml
└── src/
└── main.rs -
Cargo.tomlにActix Webの依存関係を追加します
toml
[dependencies]
actix-web = "4.0" # 最新版は公式ドキュメントで確認してください
必要な依存関係の追加
Actix Webの機能を活用するには、以下のライブラリも一緒に導入すると便利です。
serde:JSONデータのシリアライズ・デセリアライズに使用します。dotenv:.envファイルから環境変数を読み込む際のサポートです。
Cargo.tomlに追加する例:
|
1 2 3 4 5 |
[dependencies] actix-web = "4.0" serde = { version = "1.0", features = ["derive"] } dotenv = "0.15" |
非同期ハンドラの実装手順
Actix Webは非同期処理をサポートしており、async/awaitを使用してリクエストを効率的に処理できます。このセクションでは、簡単なHTTPハンドラを作成する方法を紹介します。
async/awaitの基本構文
Actix Webでは、非同期関数を定義し、async fnを用いてリクエストを処理します。これにより、I/O操作や並列処理が簡潔に記述できます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
use actix_web::{web, App, HttpResponse, HttpServer}; async fn hello() -> HttpResponse { HttpResponse::Ok().body("Hello, Actix Web!") } #[actix_web::main] async fn main() -> std::io::Result<()> { HttpServer::new(|| App::new().route("/", web::get().to(hello))) .bind("127.0.0.1:8080")? .run() .await } |
ハンドラ関数に
async fnを付与することで、非同期処理が可能になります。
リクエスト処理例
以下は、GETリクエストを受け取ってJSONレスポンスを返す例です。serdeライブラリを使用して、構造体のシリアライズを行います。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
use actix_web::{web, App, HttpResponse, HttpServer}; use serde::Serialize; #[derive(Serialize)] struct ResponseData { message: String, timestamp: usize, } async fn json_response() -> Result<HttpResponse, actix_web::Error> { let data = ResponseData { message: "Actix Web JSON Response".to_string(), timestamp: 1234567890, }; Ok(HttpResponse::Ok().json(data)) } |
動作確認方法:
main.rsに上述のコードを貼り付けます。cargo runコマンドでサーバーを起動します。- ブラウザやcurlで
http://localhost:8080にアクセスすると、JSONデータが返されます。
ルーティングとパラメータ処理
Actix Webでは、ルート設定やURLパラメータの取得方法を柔軟に対応できます。GET/POSTメソッドごとに異なるハンドラを設定可能です。
基本的なルート設定
以下は、/users/{id}という動的ルートにアクセスする際の例です。
|
1 2 3 4 5 6 7 |
use actix_web::{web, App, HttpResponse, HttpServer}; async fn get_user_info(id: web::Path<String>) -> HttpResponse { let user_id = id.into_inner(); format!("User ID is {}", user_id) } |
ルートを登録するコード例:
|
1 2 3 |
App::new() .route("/users/{id}", web::get().to(get_user_info)) |
動的パラメータの取得方法
URLから動的な情報を抽出するには、web::Path<T>を使用します。
|
1 2 3 4 5 6 7 |
use actix_web::{web, App, HttpResponse}; async fn get_data(id: web::Path<String>) -> HttpResponse { let param_id = id.into_inner(); format!("Received ID: {}", param_id) } |
この方法で、/data/12345のようなURLから12345というパラメータを取得できます。
Actix Webのセッション管理
Actix Webでは、ユーザー認証やステートフルな処理に適したセッション管理機能が提供されています。クッキーベースとデータベースベースの両方に対応可能です。
セッションストレージの選択
| タイプ | 説明 | 用途 |
|---|---|---|
| クッキーベース | ブラウザにセッションIDを保存 | 軽量なアプリケーション向け |
| データベースベース | サーバー側のDBで管理 | 大規模なユーザー数やセキュリティが重要 |
クッキーベースセッション実装例
以下は、クッキーを使用した簡単なセッション管理のコードです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
use actix_web::{web, App, HttpResponse, HttpServer}; use std::collections::HashMap; struct SessionStore { data: HashMap<String, String>, } impl SessionStore { fn new() -> Self { Self { data: HashMap::new(), } } fn get(&self, session_id: &str) -> Option<&String> { self.data.get(session_id) } fn set(&mut self, session_id: String, value: String) { self.data.insert(session_id, value); } } async fn login( data: web::Data<SessionStore>, user_id: web::Path<String>, ) -> HttpResponse { let new_session_id = "session_12345".to_string(); data.set(new_session_id.clone(), format!("user:{}", user_id)); HttpResponse::Ok().json(&new_session_id) } |
このコードでは、簡単なセッションID管理が行われています。実際には、クッキーとDBを組み合わせた方法を採用する必要があります。
Actix Webのミドルウェア活用
ミドルウェアは、リクエストの前処理や後処理を行うための機能です。Actix Webでは、ログ出力や認証チェックを簡単なコードで実装できます。
標準ミドルウェアの導入
Actix Webには標準的なミドルウェアが用意されており、デバッグ情報を出力するTraceミドルウェアなどがあります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
use actix_web::{App, HttpResponse, HttpServer}; use actix_web::middleware::{Logger, Trace}; fn main() -> std::io::Result<()> { HttpServer::new(|| { App::new() .wrap(Logger::default()) // リクエスト情報をログ出力 .wrap(Trace::new()) // タイムトラッキングなどに使用 .route("/", web::get().to(|| HttpResponse::Ok())) }) .bind("127.0.0.1:8080")? .run() } |
ミドルウェアのカスタマイズ
独自のミドルウェアを実装するには、FromRequestトレイトを実装した構造体を作成します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
use actix_web::{dev, FromRequest, HttpRequest}; use std::future::Future; struct CustomMiddleware; impl<T> FromRequest<T> for CustomMiddleware { type Future = Box<dyn Future<Output = Self> + 'static>; fn from_request(req: &HttpRequest<T>, _payload: &mut dev::Payload) -> Self::Future { Box::new(std::future::ready(CustomMiddleware)) } } |
このようにして、リクエスト処理前のカスタムロジックを実装できます。
ローカル環境での起動確認手順
Actix Webアプリケーションが正常に動作するか確認するために、ローカルでサーバーを起動し、簡単なAPIテストを行いましょう。
アプリケーションの起動コマンド
cargo run コマンドを使用して、プロジェクトを起動します。
|
1 2 3 |
cd actix_web_sample cargo run |
実行結果:
|
1 2 |
INFO actix_server::server - Actix-web server started on 127.0.0.1:8080 |
ブラウザでの動作テスト
ブラウザやcurlで、http://localhost:8080にアクセスして動作を確認します。
curlでの例:
|
1 2 |
curl http://localhost:8080 |
JSON応答の例:
|
1 2 3 4 5 |
{ "message": "Actix Web JSON Response", "timestamp": 1234567890 } |
起動確認が成功すれば、次はAPIやセッション処理などさらに複雑な機能へと進んでいくことが可能になります。
参考情報
- Actix Web公式ドキュメント: https://actix.rs
- Cargo.tomlで使用する最新バージョンは公式リポジトリを参照
- 事例やサンプルコードはGitHubリポジトリで確認可能