Axum 的 handler 很朴素:
一个 async fn,拿若干提取器当参数,返回任何能转成响应的东西。
比如:
use axum::{http::StatusCode, Json};
use serde::Serialize;
#[derive(Serialize)]
struct Health {
ok: bool,
service: &'static str,
}
async fn health() -> (StatusCode, Json<Health>) {
(
StatusCode::OK,
Json(Health {
ok: true,
service: "north-gate",
}),
)
}Axum 官方对 handler 的定义非常稳定:
Handler
= async fn
+ 0 个或多个 extractor 参数
+ 返回一个 IntoResponse也就是说,你写的不是“框架专用对象”,而是一个签名很清楚的 Rust 异步函数。
这会带来两个很大的好处:
- 读代码时,窗口需要什么材料,一眼就在函数参数里
- 写代码时,回执长什么样,一眼就在返回类型里
所以 Axum 的 handler 心智,不是“我在框架里塞逻辑”,而是:
我在写一个检查窗口,它显式声明自己要收哪些证件,最后吐出怎样的回执。