全书目录

第三十九篇:Axum 完全指南 —— Rust 类型关口宇宙

第十六章:Axum 不只会回 JSON —— 它也能处理 WebSocket、流式响应和上传

1 分钟 249 字 第 762 / 962 个阅读单元

很多人把 Axum 误解成“Rust 版 JSON API 框架”。

这太窄了。

Axum 官方稳定支持的能力里,除了普通 HTTP 响应,还有:

  • WebSocket
  • SSE
  • Multipart
  • 各种自定义响应体

比如 WebSocket:

toml
axum = { version = "0.8.8", features = ["ws"] }
rust
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 的总关不只是发纸面回执,它还可以:

text
类型总关
├── 普通 JSON 放行单
├── WebSocket 长连接通道
├── SSE 持续播报板
└── Multipart 文件验货口