很多人把 Axum 误解成“Rust 版 JSON API 框架”。
这太窄了。
Axum 官方稳定支持的能力里,除了普通 HTTP 响应,还有:
- WebSocket
- SSE
- Multipart
- 各种自定义响应体
比如 WebSocket:
axum = { version = "0.8.8", features = ["ws"] }use axum::{
extract::ws::{Message, WebSocket, WebSocketUpgrade},
response::IntoResponse,
routing::any,
Router,
};
async fn ws_handler(ws: WebSocketUpgrade) -> impl IntoResponse {
ws.on_upgrade(handle_socket)
}
async fn handle_socket(mut socket: WebSocket) {
while let Some(Ok(message)) = socket.recv().await {
if let Message::Text(text) = message {
let _ = socket
.send(Message::Text(format!("echo: {text}").into()))
.await;
}
}
}
let app = Router::new().route("/ws", any(ws_handler));这里有个官方文档点名提醒过的细节:
WebSocketUpgrade 在 HTTP/1.1 下要求 GET,在更后续协议语境里会用 CONNECT,为了兼容两边,推荐用 any 来挂这个 handler。
所以 Axum 的总关不只是发纸面回执,它还可以:
类型总关
├── 普通 JSON 放行单
├── WebSocket 长连接通道
├── SSE 持续播报板
└── Multipart 文件验货口