Axumのルーティング
ハンドラーとルート
「Axumのルーティング」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。
Axum とは
Axum は、Tokio チームが開発した使いやすい非同期 Web フレームワークです。tower と hyper を基盤にしています。
- ハンドラーは通常の async 関数である
- ルーティングは型を中心に構成でき、組み合わせも可能である
- Tokio ランタイム上で動作する
ハンドラーは関数
Axum のハンドラーは、&str や String など、レスポンスに変換できる値を返す async 関数です。
async fn hello() -> &'static str {
"Hello, world!"
}Router を構築する
Router はパスをハンドラーに対応付けます。get のような HTTP メソッドのフィルターとともに route を使います。
use axum::{Router, routing::get};
async fn hello() -> &'static str { "Hello" }
fn app() -> Router {
Router::new().route("/", get(hello))
}サーバーを起動する
TCP リスナーをバインドして、ルーターを提供します。#[tokio::main] マクロが非同期ランタイムをセットアップします。
use axum::{Router, routing::get};
#[tokio::main]
async fn main() {
let app = Router::new().route("/", get(|| async { "Hi" }));
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}複数のルート
route の呼び出しを連結して、1 つのルーターに複数のエンドポイントを登録します。
use axum::{Router, routing::get};
fn app() -> Router {
Router::new()
.route("/", get(|| async { "home" }))
.route("/about", get(|| async { "about" }))
}異なる HTTP メソッド
get(...).post(...) を使うと、1 つのパスに複数のメソッド用ハンドラーを組み合わせられます。各メソッドはそれぞれのハンドラーにルーティングされます。
use axum::{Router, routing::get};
fn app() -> Router {
Router::new().route(
"/items",
get(|| async { "list" }).post(|| async { "create" }),
)
}パスパラメーター
{name} セグメントで URL の一部を取得し、Path extractor を使って読み取ります。
use axum::extract::Path;
async fn show(Path(id): Path<u32>) -> String {
format!("item {}", id)
}通常の Rust でルーティングをモデル化する
ルーティングの中心は、パスをレスポンスに対応付けることです。ここでは、フレームワークを使わずにその考え方を実行可能なモデルで示します。
fn route(path: &str) -> &str {
match path {
"/" => "home",
"/about" => "about page",
_ => "404 not found",
}
}
fn main() {
println!("{}", route("/"));
println!("{}", route("/about"));
println!("{}", route("/missing"));
}ルーターを入れ子にする
nest を使ってサブのルーターをプレフィックスの下にマウントし、大きなアプリケーションを組み立てます。
use axum::{Router, routing::get};
fn api() -> Router {
Router::new().route("/users", get(|| async { "users" }))
}
fn app() -> Router {
Router::new().nest("/api", api())
}フォールバックハンドラー
fallback を使って、一致するルートがない場合の動作を定義します。カスタム 404 ページに最適です。
use axum::{Router, http::StatusCode};
async fn not_found() -> (StatusCode, &'static str) {
(StatusCode::NOT_FOUND, "nothing here")
}
fn app() -> Router {
Router::new().fallback(not_found)
}ステータスコードを返す
ハンドラーは (StatusCode, body) のタプルを返して、レスポンスのステータスを正確に制御できます。
use axum::http::StatusCode;
async fn create() -> (StatusCode, &'static str) {
(StatusCode::CREATED, "created")
}理解度チェック
Axum のルーティングについての理解度を確認しましょう。
まとめ
Axum のルーティングの基本を学びました。
- ハンドラーはレスポンスを返す async 関数である
Router::new().route(path, get(handler))でエンドポイントを登録するPathで URL のセグメントを取得するnest、fallback、ステータスのタプルでアプリケーションの構成を整える
次は、extractor を使って受信リクエストを解析します。
よくある質問
「Axumのルーティング」レッスンは無料ですか?
はい。「Axumのルーティング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。
「Axumのルーティング」で何を学びますか?
ハンドラーとルート ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「Axumのルーティング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。