本文へスキップ
totonoe.tech

フレームワークを整える

中級

Actix Web を整える。

= main.rs を書いてリクエストを送る——Rust の Web フレームワークの「どの関数に届くか」をブラウザで確かめる

Actix Web が初めての方は、先に そもそも Actix Web とは・どんな場面で使うか をどうぞ。

サンプル(クリックでエディタと例のリクエストに反映)

#[get("/")] を付けた関数を .service() で登録する。登録し忘れた関数には届かない

src/main.rs
リクエスト

「▶ 送信」を押すと、どの関数に届くかがここに出ます。

ここで動くのは Actix Web 本体ではなく、Actix Web 4 の照合規則と引数(抽出子)の決まりを再現したものです。関数の中身(Rust のコード)は実行しません。

エンドポイントの一覧から main.rs を作る

1行に1つ「メソッド パス [名前]」を書くと、#[get] などのマクロ付きの関数と、それを .service() で登録した main.rs の雛形を作ります。パスの値は {id} でも :id でも構いません。

Cargo.toml の [dependencies] には actix-web = "4" を書きます。パスの値は String で受け取る雛形なので、数値にするなら型を u32 などに変えてください。

src/main.rs
 

そもそも Actix Web とは

Rust で、速くて型に厳しい Web サーバーを作る道具。

Actix Web は、プログラミング言語 Rust で Web サーバーや API を作るためのフレームワークです。#[get("/users/{id}")] のようなマクロを関数に付け、それを App に登録して、URL と関数を結びつけます。

Rust は、実行が速く、メモリの扱いの間違いをコンパイル時に見つけてくれる言語です。Actix Web はその特長を活かし、処理が速いことで知られています。リクエストから受け取る値も型で受けるため、「想定外の形の値」は関数に入る前に弾かれます。

どこで・どんな場面で使うか

  • 処理速度が求められる API

    同時にたくさんのアクセスをさばく API やバックエンドで、性能を重視するときに候補になります。

  • Rust で作るサービスの入り口

    ほかの部分を Rust で書いているシステムに、HTTP の受け口をつけるときに使われます。

  • 型で守られた入力の受け取り

    パスの値やクエリ、JSON を型で受けるので、形の違う入力を早い段階で止めたい場面に向きます。

  • Rust の学習・実践

    所有権などの Rust の基本を覚えたあと、実際に動く Web サービスを作る題材として選ばれます。

  • 長く動かすサーバー

    コンパイル時にチェックされる範囲が広いので、運用中の思わぬ不具合を減らしたいときに向きます。

向いている場面・向いていない場面

  • 向いている:速さと安全性を重視する API。型で受けるぶん、書く手間と引き換えに間違いを早く見つけられます。
  • 向いている:Rust をすでに使っているチーム。同じ言語でサーバーまで書けます。
  • 注意:Rust 自体の学習コストがあります。短期間で画面まで作りたい場合は、より手軽な道具のほうが合うことがあります。

上の練習場で main.rs を書き、リクエストがどの関数に届くか、引数に何が入るかを試してみてください。

Actix Web のルーティングの決まりごと

Actix Web は「登録した順に照合し、最初の一致が勝つ」が基本。そのうえで、つまずきやすい4つの決まりがあります。

  • ①

    マクロを付けただけでは届かない

    #[get("/health")] を付けた関数も、App::new().service(health) で登録しなければどこからも呼ばれず 404 になります。この練習場は登録漏れを警告します。

  • ②

    404 と 405 は登録の仕方で変わる

    マクロや .route("/x", web::get()…) はメソッドの条件を持ったまま照合されるので、メソッド違いは次へ進み、最後まで無ければ 404。web::resource("/x") にまとめた場合は、パスが合ってメソッドだけ違うと 405 Method Not Allowed(メソッド不許可) を返します。

  • ③

    scope に入ったら、外には戻らない

    web::scope("/api") は前方一致で入り、中のどれにも一致しなければその場で 404。後ろに書いた /api/… の受け皿には落ちてきません。

  • ④

    引数の型が「入口の検査」になる

    web::Path<u32> に /users/abc は入らず 404、web::Json<T> は Content-Type が違うか JSON が壊れていると 400。どちらも関数の中身が動く前に止まります。

このページについて

Rust のプログラムはブラウザの中でコンパイルも実行もできないため、Actix Web 本体は動かしていません。このページは、あなたが書いた main.rs を文字として読み取り、App::new() から続く登録と、#[get] などのマクロを Actix Web 4 の照合規則に沿って解きます。

ガード(.guard())・ミドルウェア(.wrap())・.configure()・JSON の項目の型の検査・関数の戻り値は再現していません。cargo run での本番の挙動は Actix Web の公式ドキュメントで確かめてください。

書いたコードとリクエストは端末内で処理し、外部へ送信しません(送信ゼロ)。外部のライブラリも読み込みません。

このツールについて

Actix Web は Rust の高速な Web フレームワーク。#[get("/users/{id}")] のようなマクロを付けた関数を App に登録して API を作ります。ここでは main.rs を書いてリクエストを送ると、どの関数に届き、引数に何が入るか(入らずに止まるか)をその場で確かめられます。

Actix Web の main.rs を書いてリクエストを送ると、どの関数に届き、web::Path や web::Json に何が入るか(入らずに 404・400 で止まるか)をその場で再現。405 と 404 の違いも。

主な機能

  • 4サンプル(マクロで登録・パスの値と型・スコープとリソース・JSON)
  • 一致したパス・パスの値・引数(抽出子)・照合の順番・呼ばれる関数を表示
  • .service() の登録漏れを警告
  • エンドポイント一覧から main.rs の雛形を生成・送信ゼロ

よくある質問

Q. Rust のコードがブラウザで動いているのですか?

A. 動いていません。Rust はブラウザの中でコンパイルできないため、main.rs を文字として読み取り、App::new() の登録と #[get] などのマクロを Actix Web 4 の照合規則どおりに解いて「どの関数に届くか」を再現しています。関数の中身は実行しません。

Q. 404 と 405 はどう違いますか?

A. マクロや .route("/x", web::get()…) で登録すると、メソッド違いは次の登録へ進み、最後まで無ければ 404 です。web::resource("/x") にまとめた場合は、パスが合ってメソッドだけ違うと 405 Method Not Allowed になります。

Q. /users/abc が 404 になるのはなぜですか?

A. 関数の引数が web::Path<u32> のように数値の型だと、abc を数値に変換できず、関数が呼ばれる前に 404 Not Found で止まるためです。文字列も受け付けたいなら String で受け取ります。

入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。

続けて整える

運営サイト

私たちが運営するサイト