Routing และ Handlers
Express routes vs Axum routes
หัวข้อที่มีชื่อว่า “Express routes vs Axum routes”ใน Express คุณแนบ handlers เข้ากับ app หรือ Router โดยตรง ใน Axum คุณสร้าง struct Router โดยการเชื่อม .route() ต่อกัน ไม่มี magic strings สำหรับ HTTP verbs แต่คุณ import functions เช่น get, post, put, delete จาก axum::routing แทน
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;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))}การเขียน async fn handler
หัวข้อที่มีชื่อว่า “การเขียน async fn handler”Axum handler คือ async fn ใด ๆ ที่ arguments เป็น extractors และ return type implement IntoResponse handler ที่ง่ายที่สุดคือการ return string:
// Expressasync function hello(req, res) { res.send('Hello, World!');}// Axum — returning a plain stringasync fn hello() -> &'static str { "Hello, World!"}impl IntoResponse — return อะไรก็ได้
หัวข้อที่มีชื่อว่า “impl IntoResponse — return อะไรก็ได้”Axum handlers สามารถ return ได้หลายประเภท: &str, String, Json<T>, (StatusCode, Json<T>) หรือประเภทที่กำหนดเองตราบใดที่ implement IntoResponse
// Express — manual JSON responseasync function listUsers(req, res) { const users = [{ id: 1, name: 'Alice' }]; res.status(200).json(users);}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))}Nested routers และการ mount
หัวข้อที่มีชื่อว่า “Nested routers และการ mount”เช่นเดียวกับที่ Express ให้คุณ mount sub-routers ที่ prefix ได้ Axum รองรับ Router::nest:
// Expressimport userRouter from './users.router';app.use('/api/v1', userRouter);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เพื่อทดสอบ