セットアップ

今回は非同期ランタイムライブラリで有名な tokio が開発している 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 = "2018"

[dependencies]
axum = "0.3"
tokio = { version = "1.0", features = ["full"] }

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

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

#[tokio::main]  // main関数を非同期関数にするために必要
async fn main() {
    let app = Router::new().route("/", get(handler));
    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
    println!("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>")
}

Note: src/main.rs は特別なファイルです。 プログラムを実行すると、必ずこのファイルのmain関数から始まります。

特に重要なのが

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

この1行です。これは

/ のパスに GET でアクセスがあったら handler を実行せよ

という意味になります。詳しくはファイルの配信のページで解説します。

ここまで実装したらバイナリを実行してみましょう。

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.03s
     Running `target/debug/rustwi`
listening on 127.0.0.1:3000

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

とはいえ、これはまだウェブサービス製作のほんの入口です。次のページ以降で、より柔軟なHTMLを返却する方法を学びます。