ข้ามไปยังเนื้อหา

Routing และ Handlers

ใน Express คุณแนบ handlers เข้ากับ app หรือ Router โดยตรง ใน Axum คุณสร้าง struct Router โดยการเชื่อม .route() ต่อกัน ไม่มี magic strings สำหรับ HTTP verbs แต่คุณ import functions เช่น get, post, put, delete จาก axum::routing แทน

TypeScript
import express from 'express';
const router = express.Router();
router.get('/users', listUsers);
router.post('/users', createUser);
router.get('/users/:id', getUser);
router.delete('/users/:id', deleteUser);
export default router;
Rust
use axum::{
routing::{delete, get, post},
Router,
};
use crate::handlers::users::{
create_user, delete_user, get_user, list_users,
};
pub fn users_router() -> Router {
Router::new()
.route("/users", get(list_users).post(create_user))
.route("/users/:id", get(get_user).delete(delete_user))
}

Axum handler คือ async fn ใด ๆ ที่ arguments เป็น extractors และ return type implement IntoResponse handler ที่ง่ายที่สุดคือการ return string:

TypeScript
// Express
async function hello(req, res) {
res.send('Hello, World!');
}
Rust
// Axum — returning a plain string
async fn hello() -> &'static str {
"Hello, World!"
}

Axum handlers สามารถ return ได้หลายประเภท: &str, String, Json<T>, (StatusCode, Json<T>) หรือประเภทที่กำหนดเองตราบใดที่ implement IntoResponse

TypeScript
// Express — manual JSON response
async function listUsers(req, res) {
const users = [{ id: 1, name: 'Alice' }];
res.status(200).json(users);
}
Rust
use axum::{http::StatusCode, Json};
use serde::Serialize;
#[derive(Serialize)]
struct User {
id: u32,
name: String,
}
async fn list_users() -> (StatusCode, Json<Vec<User>>) {
let users = vec![User { id: 1, name: "Alice".to_string() }];
(StatusCode::OK, Json(users))
}

เช่นเดียวกับที่ Express ให้คุณ mount sub-routers ที่ prefix ได้ Axum รองรับ Router::nest:

TypeScript
// Express
import userRouter from './users.router';
app.use('/api/v1', userRouter);
Rust
use axum::Router;
pub fn create_router() -> Router {
Router::new()
.nest("/api/v1", users_router())
.nest("/api/v1", health_router())
}

รันบนเครื่องของคุณ — handlers ต้องการ Axum server ที่กำลังทำงาน ใช้ cargo run เพื่อเริ่ม server จากนั้น curl http://localhost:3000/users เพื่อทดสอบ

คุณแนบ GET handler กับ `/users` ใน Axum อย่างไร?
trait ใดที่ return type ของ Axum handler ต้องการ implement?
function ใดของ Axum เทียบเท่ากับ `app.use('/api/v1', subRouter)` ของ Express?