フレームワークを整える
中級Actix Web を整える。
= main.rs を書いてリクエストを送る——Rust の Web フレームワークの「どの関数に届くか」をブラウザで確かめる
Actix Web が初めての方は、先に そもそも Actix Web とは・どんな場面で使うか をどうぞ。
サンプル(クリックでエディタと例のリクエストに反映)
#[get("/")] を付けた関数を .service() で登録する。登録し忘れた関数には届かない
「▶ 送信」を押すと、どの関数に届くかがここに出ます。
ここで動くのは Actix Web 本体ではなく、Actix Web 4 の照合規則と引数(抽出子)の決まりを再現したものです。関数の中身(Rust のコード)は実行しません。
エンドポイントの一覧から main.rs を作る
1行に1つ「メソッド パス [名前]」を書くと、#[get] などのマクロ付きの関数と、それを .service() で登録した main.rs の雛形を作ります。パスの値は {id} でも :id でも構いません。
Cargo.toml の [dependencies] には actix-web = "4" を書きます。パスの値は String で受け取る雛形なので、数値にするなら型を u32 などに変えてください。
そもそも 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/…の受け皿には落ちてきません。 - ④
このページについて
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の「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。