Rust轻量级路由库burn-router的使用:高效Web应用路由管理解决方案
Rust轻量级路由库burn-router的使用:高效Web应用路由管理解决方案
安装
在项目目录中运行以下Cargo命令:
cargo add burn-router
或者在Cargo.toml中添加以下行:
burn-router = "0.18.0"
基本使用示例
下面是burn-router的基本使用示例:
use burn_router::{Router, Route};
// 定义路由枚举
#[derive(Debug, Route)]
enum AppRoute {
#[route("/")]
Home,
#[route("/about")]
About,
#[route("/users/:id")]
User { id: u32 },
#[route("/posts/*path")]
Post { path: String },
}
fn main() {
// 解析路由
let route = AppRoute::parse("/users/42").unwrap();
println!("{:?}", route); // 输出: User { id: 42 }
// 生成URL
let url = AppRoute::User { id: 42 }.to_url();
println!("{}", url); // 输出: /users/42
}
完整示例demo
下面是一个完整的Web应用路由管理解决方案示例:
use burn_router::{Router, Route};
use std::net::{TcpListener, TcpStream};
use std::io::{Read, Write};
// 定义应用路由
#[derive(Debug, Route)]
enum AppRoute {
#[route("/")]
Home,
#[route("/about")]
About,
#[route("/contact")]
Contact,
#[route("/products/:id")]
Product { id: u32 },
#[route("/blog/*path")]
BlogPost { path: String },
}
// 处理HTTP请求
fn handle_request(stream: &mut TcpStream) {
let mut buffer = [0; 1024];
stream.read(&mut buffer).unwrap();
let request = String::from_utf8_lossy(&buffer[..]);
let path = request.split_whitespace().nth(1).unwrap_or("/");
// 解析路由
match AppRoute::parse(path) {
Ok(route) => {
let response = match route {
AppRoute::Home => "HTTP/1.1 200 OK\r\n\r\n<h1>Welcome Home</h1>",
AppRoute::About => "HTTP/1.1 200 OK\r\n\r\n<h1>About Us</h1>",
AppRoute::Contact => "HTTP/1.1 200 OK\r\n\r\n<h1>Contact Page</h1>",
AppRoute::Product { id } => format!("HTTP/1.1 200 OK\r\n\r\n<h1>Product #{}</h1>", id),
AppRoute::BlogPost { path } => format!("HTTP/1.1 200 OK\r\n\r\n<h1>Blog Post: {}</h1>", path),
};
stream.write(response.as_bytes()).unwrap();
}
Err(_) => {
let response = "HTTP/1.1 404 NOT FOUND\r\n\r\n<h1>404 Not Found</h1>";
stream.write(response.as_bytes()).unwrap();
}
}
stream.flush().unwrap();
}
fn main() {
// 启动服务器
let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
println!("Server running at http://127.0.0.1:8080");
for stream in listener.incoming() {
let mut stream = stream.unwrap();
handle_request(&mut stream);
}
}
功能特点
- 轻量级:burn-router是一个专注于路由管理的轻量级库
- 类型安全:利用Rust的枚举和derive宏实现类型安全的路由
- 参数支持:支持路径参数和通配符匹配
- 双向转换:可以从URL解析路由,也可以将路由转换为URL
- 简单易用:通过简单的属性宏定义路由
burn-router是构建高效Web应用路由管理的理想解决方案,特别适合需要轻量级路由库的项目。
1 回复
Rust轻量级路由库burn-router使用指南
介绍
burn-router是一个轻量级、高性能的Rust Web路由库,专为构建高效Web应用而设计。它具有以下特点:
- 极简设计:核心功能精简,不包含多余依赖
- 高性能:基于Trie树的路由匹配算法,查找效率高
- 灵活路由:支持参数路由、通配符和正则匹配
- 中间件支持:可扩展的中间件系统
安装
在Cargo.toml中添加依赖:
[dependencies]
burn-router = "0.3"
基本使用
1. 创建路由和处理函数
use burn_router::{Router, Request, Response};
// 首页处理函数
async fn index(_req: Request) -> Response {
Response::new().body("Hello, Burn Router!")
}
// 问候处理函数
async fn greet(req: Request) -> Response {
let name = req.params().get("name").unwrap();
Response::new().body(format!("Hello, {}!", name))
}
#[tokio::main]
async fn main() {
let mut router = Router::new();
// 添加路由
router.get("/", index);
router.get("/greet/:name", greet);
// 启动服务器
router.serve("127.0.0.1:8080").await.unwrap();
}
2. 路由参数
burn-router支持多种参数匹配方式:
// 路径参数示例
router.get("/user/:id", user_handler);
// 通配符匹配示例
router.get("/post/*", post_handler);
// 正则匹配示例
router.get(r"/date/(\d{4}-\d{2}-\d{2})", date_handler);
3. 中间件使用
use burn_router::middleware::{Middleware, Next};
// 日志中间件
async fn logger_middleware(req: Request, next: Next) -> Response {
println!("Request: {} {}", req.method(), req.path());
next.run(req).await
}
fn main() {
let mut router = Router::new();
// 添加全局中间件
router.with(logger_middleware);
// 路由定义...
}
高级功能
1. 路由分组
let mut api_router = Router::new();
api_router.get("/users", list_users);
api_router.post("/users", create_user);
let mut main_router = Router::new();
// 挂载子路由
main_router.nest("/api", api_router);
2. 自定义错误处理
use burn_router::Error;
// 404处理函数
async fn handle_404(_req: Request) -> Response {
Response::new().status(404).body("Not Found")
}
fn main() {
let mut router = Router::new();
// 设置错误处理
router.set_error_handler(Error::NotFound, handle_404);
// ...
}
3. 限制HTTP方法
// 同一路径不同方法
router.route("/user")
.get(get_user)
.post(create_user)
.put(update_user)
.delete(delete_user);
性能优化技巧
- 路由顺序:将最频繁访问的路由放在前面
- 减少动态路由:尽量使用静态路由
- 合理使用中间件:避免不必要的中间件处理
完整示例demo
下面是一个完整的burn-router使用示例,包含路由、中间件和错误处理:
use burn_router::{Router, Request, Response, Error};
use burn_router::middleware::{Middleware, Next};
// 处理函数
async fn home(_req: Request) -> Response {
Response::new().body("Welcome to Home Page")
}
async fn user_profile(req: Request) -> Response {
let id = req.params().get("id").unwrap();
Response::new().body(format!("User Profile: {}", id))
}
async fn about(_req: Request) -> Response {
Response::new().body("About Us")
}
// 自定义404处理
async fn not_found(_req: Request) -> Response {
Response::new().status(404).body("Custom 404 Page")
}
// 认证中间件
async fn auth_middleware(req: Request, next: Next) -> Response {
if let Some(token) = req.headers().get("Authorization") {
println!("Auth token: {}", token);
next.run(req).await
} else {
Response::new().status(401).body("Unauthorized")
}
}
// 日志中间件
async fn logger_middleware(req: Request, next: Next) -> Response {
println!("[{}] {}", req.method(), req.path());
next.run(req).await
}
#[tokio::main]
async fn main() {
let mut router = Router::new();
// 添加中间件
router.with(logger_middleware);
router.with(auth_middleware);
// 添加路由
router.get("/", home);
router.get("/about", about);
router.get("/user/:id", user_profile);
// 设置错误处理
router.set_error_handler(Error::NotFound, not_found);
// 启动服务器
println!("Server running on http://127.0.0.1:8080");
router.serve("127.0.0.1:8080").await.unwrap();
}
示例项目结构
src/
├── main.rs
├── handlers/
│ ├── mod.rs
│ ├── user.rs
│ └── post.rs
└── middleware/
├── mod.rs
└── auth.rs
通过burn-router,你可以快速构建高效、可维护的Rust Web应用路由系统。它的轻量级设计特别适合需要高性能路由的场景。