# Rust Axum Web 开发

Axum 是 Tokio 团队出品的现代 Web 框架，基于异步，API 简洁。**它和前面学的 trait、async、所有权无缝衔接**，是练手最佳选择。

![Rust 框架实战：Axum Web 服务](https://img.zhaojq.top/20260804234640661.png "Rust 框架实战：Axum Web 服务")

## 依赖

`Cargo.toml`：

```toml
[dependencies]
axum = "0.7"
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }
```

## 最小服务

```rust
use axum::{routing::get, Router};

async fn hello() -> &'static str {
    "Hello from Axum!"
}

#[tokio::main]
async fn main() {
    let app = Router::new().route("/", get(hello));
    let listener = tokio::net::TcpListener::bind("127.0.0.1:3000")
        .await
        .unwrap();
    println!("🚀 监听 http://127.0.0.1:3000");
    axum::serve(listener, app).await.unwrap();
}
```

`Router::new()` 注册路由，`get(hello)` 把处理函数挂到 `/`。运行后浏览器访问即可看到响应。

## JSON 接口（含 Serde）

```rust
use axum::{routing::post, Json, Router};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
struct User { name: String, age: u32 }

async fn create(Json(user): Json<User>) -> Json<User> {
    println!("收到: {} {}", user.name, user.age);
    Json(user) // 自动序列化回 JSON
}

#[tokio::main]
async fn main() {
    let app = Router::new().route("/user", post(create));
    // ... 监听同前
}
```

`#[derive(Serialize, Deserialize)]` 让结构体自动与 JSON 互转——这就是 Serde 的威力。

## 小结

- Axum 路由 = `Router` + `route(path, method(handler))`。
- 处理函数是 `async fn`，返回字符串或 `Json<T>`。
- 配合 Tokio 异步、Serde 序列化，一个生产级 API 几十行就成型。

➡️ [12. CLI 工具与序列化（clap + Serde）](rust-12-cli-serde.md)

