3 个版本 (重大更新)
0.3.0 | 2024 年 7 月 24 日 |
---|---|
0.2.0 | 2024 年 1 月 19 日 |
0.1.0 | 2023 年 12 月 29 日 |
#6 in #xitca-web
每月 560 次下载
在 3 个 Crates 中使用 (via xitca-http)
105KB
2.5K SLoC
基于 matchit 的分支
与 matchit 比较
- 优点
- 具有无生命周期污染的干净公共类型。(更容易传递参数)
- 100% 安全的 Rust。(通过依赖项仍然使用 unsafe 代码)
- 缺点
- 不可变路由值。
- 在微基准测试中可能较慢。
lib.rs
:
使用小字符串类型进行参数生命周期省略的基于 matchit 的分支
let mut router = xitca_router::Router::new();
router.insert("/home", "Welcome!")?;
router.insert("/users/:id", "A User")?;
let matched = router.at("/users/978")?;
assert_eq!(*matched.value, "A User");
// params is owned value that can be sent between threads.
let params = matched.params;
std::thread::spawn(move || {
assert_eq!(params.get("id"), Some("978"));
})
.join()
.unwrap();
参数
除了静态路由外,路由器还支持动态路由段。这些可以是命名参数或通配符参数
命名参数
命名参数,如 /:id
匹配到下一个 /
或路径末尾的任何内容
let mut m = xitca_router::Router::new();
m.insert("/users/:id", true)?;
assert_eq!(m.at("/users/1")?.params.get("id"), Some("1"));
assert_eq!(m.at("/users/23")?.params.get("id"), Some("23"));
assert!(m.at("/users").is_err());
通配符参数
通配符参数以 *
开头,并匹配 /
之后的任何内容。它们必须始终位于路由的 末尾
let mut m = xitca_router::Router::new();
m.insert("/*p", true)?;
assert_eq!(m.at("/foo.js")?.params.get("p"), Some("foo.js"));
assert_eq!(m.at("/c/bar.css")?.params.get("p"), Some("c/bar.css"));
宽松的通配符参数
具有单个 *
的宽松通配符参数匹配 /
之后的任何内容(包括 /
本身)。由于没有与 Params 键关联的标识符,它们被保留为空。它们必须始终位于路由的 末尾
let mut m = xitca_router::Router::new();
m.insert("/*", true)?;
assert!(m.at("/")?.value);
assert!(m.at("/foo")?.value);
路由优先级
静态和动态路由段可以重叠。如果它们重叠,则静态段将具有更高的优先级
let mut m = xitca_router::Router::new();
m.insert("/", "Welcome!").unwrap() ; // priority: 1
m.insert("/about", "About Me").unwrap(); // priority: 1
m.insert("/*filepath", "...").unwrap(); // priority: 2