mcpField
A
actix-web

actix-web

github.com/claude-dev-suite開発4651 回インストール2 日前に更新
リポジトリ

actix-web について

Rust の Actix-web で Web アプリを構築する開発者向けの基礎知識スキルです。ルーティング、エクストラクター、状態管理、ミドルウェアの設定例とガイダンスを提供します。

主な機能

  1. 01Actix-web アプリのセットアップ
  2. 02マクロによるルート定義
  3. 03パス、クエリ、JSON エクストラクターの利用
  4. 04共有アプリケーション状態の管理
  5. 05組み込みログ・圧縮ミドルウェアの適用
  6. 06ヘルスチェックとレディネスエンドポイントの追加

活用シーン

  1. 01Rust の HTTP ルートとハンドラーの作成
  2. 02リクエストパラメーターと JSON ボディの解析
  3. 03アプリケーションハンドラー間で状態を共有

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/claude-dev-suite/claude-dev-suite --skill actix-web

インストール後、Claude Code で/actix-webを入力して読み込まれたか確認します。

同梱ファイルadvanced.md

詳細

Actix-web コアナレッジ

完全なリファレンス:カスタムタイミングミドルウェア、認証ミドルウェア、カスタムエラー型、WebSocket アクター、グレースフルシャットダウンのパターンについては、advanced.md を参照してください。

詳細なナレッジ:包括的なドキュメントについては、テクノロジーに actix-web を指定して mcp__documentation__fetch_docs を使用してください。

基本的なセットアップ

# Cargo.toml
[dependencies]
actix-web = "4"
actix-rt = "2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tokio = { version = "1", features = ["full"] }
use actix_web::{web, App, HttpServer, HttpResponse, Responder};

async fn hello() -> impl Responder {
    HttpResponse::Ok().body("Hello, World!")
}

#[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
}

ルートマクロ

use actix_web::{get, post, web, HttpResponse, Responder};

#[get("/users/{id}")]
async fn get_user(path: web::Path<u32>) -> impl Responder {
    let id = path.into_inner();
    HttpResponse::Ok().json(serde_json::json!({ "id": id }))
}

#[post("/users")]
async fn create_user(body: web::Json<CreateUser>) -> impl Responder {
    HttpResponse::Created().json(body.into_inner())
}

// Register with App
App::new()
    .service(get_user)
    .service(create_user)

エクストラクター

エクストラクター用途
web::Path<T>URL パスパラメーター
web::Query<T>クエリー文字列
web::Json<T>JSON ボディ
web::Form<T>フォームデータ
web::Data<T>アプリケーションの状態

アプリケーションの状態

struct AppState {
    db_pool: Pool<Postgres>,
}

#[get("/users")]
async fn list_users(data: web::Data<AppState>) -> impl Responder {
    let users = sqlx::query_as!(User, "SELECT * FROM users")
        .fetch_all(&data.db_pool)
        .await?;
    HttpResponse::Ok().json(users)
}

HttpServer::new(move || {
    App::new()
        .app_data(web::Data::new(state.clone()))
        .service(list_users)
})

組み込みミドルウェア

use actix_web::middleware::{Logger, Compress, NormalizePath};

App::new()
    .wrap(Logger::default())
    .wrap(Compress::default())
    .wrap(NormalizePath::trim())

ヘルスチェック

#[get("/health")]
async fn health() -> impl Responder {
    HttpResponse::Ok().json(serde_json::json!({ "status": "healthy" }))
}

#[get("/ready")]
async fn ready(data: web::Data<AppState>) -> impl Responder {
    match data.db_pool.acquire().await {
        Ok(_) => HttpResponse::Ok().json(serde_json::json!({
            "status": "ready",
            "database": "connected"
        })),
        Err(_) => HttpResponse::ServiceUnavailable().json(serde_json::json!({
            "status": "not ready"
        })),
    }
}

このスキルを使用しない場合

  • Axum プロジェクト - Axum は Tower エコシステムとの連携がより直感的です
  • Rocket プロジェクト - Rocket はコンパイル時の保証がより優れています
  • Warp プロジェクト - Warp は合成にフィルターを使用します
  • シンプルな CLI ツール - Web サーバーは不要です
  • 組み込みシステム - リソースが限られたデバイスには重すぎます

アンチパターン

アンチパターン問題点解決策
リクエストごとに .clone() を実行するパフォーマンスのオーバーヘッド共有状態には web::Data<Arc<T>> を使用します
非同期ハンドラー内でブロッキング I/O を行うエグゼキュータースレッドがブロックされますブロッキング操作には web::block() を使用します
エクストラクターを使用しない手動の解析はエラーが発生しやすくなりますJson、Path、Query エクストラクターを使用します
#[actix_web::main] がないランタイムを手動でセットアップする必要がありますシンプルなセットアップにはマクロを使用します
グローバルな可変状態データ競合が発生しますweb::Data と Mutex または RwLock を使用します
カスタムエラー型がない汎用的なエラーメッセージになりますResponseError トレイトを実装します

トラブルシューティングの概要

問題診断修正
「Cannot move out of borrowed content」所有権の問題データをクローンするか、web::Data<Arc<T>> を使用します
ハンドラーが見つからない(404)ルートが登録されていません.service() または .route() の呼び出しを確認します
JSON の解析に失敗するContent-Type が正しくありませんクライアントが Content-Type: application/json を送信していることを確認します
パフォーマンスが遅いブロッキング I/Oブロッキングコードを web::block() でラップします
WebSocket 接続が閉じるping/pong がありませんハートビートの仕組みを実装します
状態にアクセスできないアプリに追加されていませんアプリの構築時に .app_data() を使用します

チェックリスト

  • CORS が適切に設定されている
  • 認証ミドルウェア
  • カスタムエラー処理
  • リクエストログ(Logger ミドルウェア)
  • ヘルス/レディネスエンドポイント
  • グレースフルシャットダウン
  • データベースのコネクションプーリング
  • 入力検証
  • レート制限(actix-ratelimit)

リファレンスドキュメント

コメント