フレームワークのセットアップ

今回は非同期ランタイムライブラリで有名な tokio が開発している axum を使います。axumはマクロを使わずに作られており、見通しの良い実装がし易くなっています。

 
今回のコード

Hello, world!

まずはRustプロジェクトを作成します。

$ mkdir rustwi
$ cd rustwi
$ cargo init
     Created binary (application) package

次に Cargo.toml[dependencies] 節にクレートを追加します。

Cargo.toml
[package]
name = "rustwi"
version = "0.1.0"
edition = "2021"

[dependencies]
axum = "0.4"
tokio = { version = "1.0", features = ["full"] }
tracing = "0.1"
tracing-subscriber = { version="0.3", features = ["env-filter"] }

メインのソースコードも変更します。

src/main.rs
use axum::{response::Html, routing::get, Router};
use std::net::SocketAddr;

#[tokio::main]  // main関数を非同期関数にするために必要
async fn main() {
    if std::env::var_os("RUST_LOG").is_none() {
        std::env::set_var("RUST_LOG", "rustwi=debug")
    }
    tracing_subscriber::fmt::init();

    let app = Router::new().route("/", get(handler));

    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
    tracing::debug!("listening on {}", addr);
    axum::Server::bind(&addr)
        .serve(app.into_make_service())
        .await
        .unwrap();
}

async fn handler() -> Html<&'static str> {
    Html("<h1>Hello, World!</h1>")
}

ルーティング

ルーティングは Router で行います。Router#route でハンドラー関数を登録します。

fn main() {
    let app = Router::new().route("/", get(handler));
}

async fn handler() -> impl IntoResponse {
    // ...
}

上記のルーティングは、あえてマクロで表現すると

#[get("/")]
async fn handler() -> impl IntoResponse {
    ...
}

のようなイメージです。 (axumでは上記のコードは動作しません)

ハンドラー関数

ハンドラー関数では、 Extractor という仕組みで、リクエストデータを引数で受け取ることができます。これについては以降のページで説明していきます。

戻り値は IntoResponse トレイトに準拠したオブジェクトを返す必要があります。例えば、前述の Html<&'static str>IntoResponse を実装しています。

その他にも、axumは様々な型に対して IntoResponse を実装してくれているので、そちらを確認してみると良いでしょう。

https://docs.rs/axum/latest/axum/response/trait.IntoResponse.html

Note: Routerにはハンドラー関数だけでなく、 towerのService に準拠したサービスを登録することもできます。

axumに 指定したディレクトリをホスティングする例 があるので、それを見てみるのも良いでしょう。

サーバーの起動

サーバーを起動してみましょう。cargoコマンドで起動できます。

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.03s
     Running `target/debug/rustwi`
2021-01-01T09:00:00.000000Z DEBUG rustwi: listening on 127.0.0.1:3000

ブラウザを開いて http://localhost:3000/ にアクセスすると、 Hello, World! と表示されるはずです。数行のコードでウェブサービスを立ち上げることができました!

次ページ以降で、より柔軟なHTMLを返却する方法を学びます。