AEX.rs - Rust 异步 HTTP + WebSocket 框架
简介
AEX.rs 是一个轻量级异步 Rust Web 框架,提供 HTTP 路由、中间件和 WebSocket 支持。 框架以 cargo aex 发布,核心功能包括:
- HTTP 路由处理
- 中间件链
- WebSocket 升级与消息处理
- 异步执行,基于 Tokio Runtime
核心概念
- Router:Trie 树路由,支持静态和动态路径匹配
- Handler:异步处理 HTTP 请求,返回 bool 表示是否继续中间件链
- Middleware:异步中间件,可组合多个功能
- WebSocket:提供握手、发送/接收消息、Ping/Pong、关闭连接
- Executor:统一封装 Handler 和 Middleware 类型
宏使用
框架提供路由生成宏,快速创建 Handler + 可选 Middleware
HTTP 方法宏:
- get!(path, handler [, middleware])
- post!(path, handler [, middleware])
- put!, delete!, patch!, options!, head!, trace!, connect!
- all!(path, handler [, middleware]) 匹配所有方法
示例: let get_home = get!("/home", |ctx: &mut HTTPContext| { Box::pin(async move { ctx.res.body.push("Welcome!".to_string()); true }) });
可选中间件: let ws_mw = WebSocket::to_middleware(ws); let get_ws = get!("/ws", |ctx: &mut HTTPContext| { Box::pin(async { true }) }, vec![ws_mw]);
route! 宏(注册路由): route!(root, get_home); route!(root, get_ws);
说明:
- 如果方法为 "*",表示匹配所有 HTTP 方法
- Handler 与 Middleware 自动封装为 Arc
- 支持多个中间件组合
WebSocket 中间件
使用 WebSocket::to_middleware(ws) 生成中间件,可用于路由注册。 示例: let ws = WebSocket { on_text: Some(Arc::new(|_ws, _ctx, msg| Box::pin(async move { println!("收到文本: {}", msg); true }))), on_binary: Some(Arc::new(|_ws, _ctx, data| Box::pin(async move { println!("收到二进制数据: {:?}", data); true }))), };
let ws_mw = WebSocket::to_middleware(ws);
let get_ws = get!("/ws", |ctx: &mut HTTPContext| Box::pin(async { true }), vec![ws_mw]); route!(root, get_ws);
访问 /ws 即可完成 WebSocket 升级和消息处理
框架优势
- 高度异步,适配 Tokio
- 简洁宏设计,快速生成路由和中间件
- 完整 WebSocket 支持(握手、消息、Ping/Pong、关闭)
- Middleware 链条灵活,可组合 WebSocket、认证、日志等
- Router 支持静态、动态路径匹配及全方法路由
目录结构
src/ aex.rs # 框架核心 router.rs # Router + Trie 节点 websocket.rs # WebSocket 核心功能 types.rs # HTTPContext, Executor, Handler 类型 macros.rs # get!, post!, route! 等宏
示例启动
#[tokio::main] async fn main() { let mut root = Router::new(NodeType::Static("root".into()));
let ws = WebSocket {
on_text: Some(Arc::new(|_ws, _ctx, msg| Box::pin(async move {
println!("{}", msg);
true
}))),
on_binary: None,
};
let ws_mw = WebSocket::to_middleware(ws);
let get_ws = get!("/ws", |ctx: &mut HTTPContext| Box::pin(async { true }), vec![ws_mw]);
route!(root, get_ws);
AexServer::new(root).bind("127.0.0.1:8080").await.unwrap().run().await;
}
说明:
- 路由 /ws 支持 WebSocket 升级
- 中间件链可组合多个功能
- 支持 HTTP 普通路由与 WebSocket 混合注册