【Rust】Rust ~ Axum / REST ~

◾️はじめに

https://dk521123.hatenablog.com/entry/2023/09/02/224707

の続き。

今回は、Rustのwebアプリケーション フレームワークであるAxum (アクサム)
をREST APIとして使用してみる。

目次

【1】AxumでREST APIを実装するには
【2】サンプル
 1)コード
 2)動作確認

【1】AxumでREST APIを実装するには

* axum::Json で返す

サンプルより抜粋

use axum::{
    Json as AxumJson,
};

async fn list_users() -> AxumJson<Vec<User>> {

【2】サンプル

* ベースは、以下のサンプルを一部編集して行う

Rust ~ Axum / 入門編 ~
https://dk521123.hatenablog.com/entry/2023/09/02/224707

1)コード

Cargo.toml

[package]
name = "backend_v2"
version = "0.1.0"
edition = "2024"

[dependencies]
# Webフレームワーク本体
axum = "0.7" 
# 非同期ランタイム (Axumの動作に必須)
tokio = { version = "1", features = ["full"] }
# JSONのシリアライズ/デシリアライズ
serde = { version = "1", features = ["derive"] }
serde_json = "1"
# 環境変数の管理
dotenvy = "0.15"
# ログ出力 (任意だが推奨)
tracing = "0.1"
tracing-subscriber = "0.3"

# Add (本質じゃないが)
uuid = { version = "1", features = ["serde", "v4"] }

main.rs

mod models;

use axum::{
    routing::get,
    Router,
    Json as AxumJson,
};
use std::net::SocketAddr;
use tokio::net::TcpListener;
use uuid::Uuid;
use crate::models::user::User;

#[tokio::main]
async fn main() {
    // ログの初期化 (デバッグ情報などをコンソールに出力)
    tracing_subscriber::fmt::init();

    // 1. ルーターの定義
    let app = Router::new()
        // HTTP GETリクエストを "/" パスで受け付ける
        .route("/", get(root_handler))
        // HTTP GETリクエストを "/users" パスで受け付ける
        .route("/users", get(list_users));
        // ここにさらにPOST, PUT, DELETEなどのルートを追加

    // 2. サーバーアドレスの設定
    let addr = SocketAddr::from(([127, 0, 0, 1], 3002));
    tracing::info!("listening on {}", addr);

    // 3. サーバーの起動
    let listener = TcpListener::bind(&addr).await.unwrap();
    // 4. axum::serve 関数を使ってリスナーとアプリを紐づける
    axum::serve(listener, app)
        .await
        .unwrap();
}

// GET / のハンドラー
async fn root_handler() -> &'static str {
    "Hello, world!!!!"
}

// GET /users のハンドラー (JSONで返す)
async fn list_users() -> AxumJson<Vec<User>> {
    let users = vec![
        User { id: Uuid::new_v4(), name: "Alice".into() },
        User { id: Uuid::new_v4(), name: "Bob".into() },
        User { id: Uuid::new_v4(), name: "Charlie".into() },
    ];
    AxumJson(users)
}

models/mod.rs

pub mod user;

models/user.rs

use serde::{Deserialize, Serialize};
use uuid::Uuid;

#[derive(Serialize, Deserialize)]
pub struct User {
    pub id: Uuid,
    pub name: String,
}

2)動作確認

実行

cargo run

動作確認

* ブラウザで以下のURLにアクセスする

http://localhost:3002/users

[
{"id":"1a71954b-e306-43d4-9955-5f5d8cfa9bc2","name":"Alice"},
{"id":"699bd5c4-9117-47e0-8e4b-ba1fa42f4764","name":"Bob"},
{"id":"32379c84-c8f7-4c48-9004-613293aaeeb3","name":"Charlie"}
]

関連記事

Rust ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/04/22/234808
Rust ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2025/11/26/224648
Rust ~ mod ~
https://dk521123.hatenablog.com/entry/2025/11/29/221911
Rust ~ crate / module ~
https://dk521123.hatenablog.com/entry/2025/12/11/234320
Rust ~ Axum / 入門編 ~
https://dk521123.hatenablog.com/entry/2023/09/02/224707
Rust ~ Axum / Docker ~
https://dk521123.hatenablog.com/entry/2025/12/08/220615