2个不稳定版本
0.2.0 | 2023年10月4日 |
---|---|
0.1.0 | 2023年10月3日 |
#11 in #http-router
35KB
585 行代码(不含注释)
Front Line
一个用于Rust的声明式、零拷贝HTTP路由器。
“front-line”包提供基于HTTP请求方法和路径进行路由的实用工具。通过声明式宏驱动方法,它适用于复杂和简单的用例。
目录
特性
- 声明式:借助proc-macro属性,您可以轻松地将路由定义为枚举。
- 零拷贝捕获:路径中的动态段,如
/users/{id}
,可以捕获而无需进行不必要的数据复制,从而确保高效的内存使用。 - 无调度:该包专注于基于路径的路由解析,调度方法则由用户自行决定。
基本用法
use front_line::{FrontLine, HttpVersion, RouterResult, Router};
#[derive(FrontLine)]
enum MarketingRoutes {
#[get("/")]
RenderIndex,
#[get("/sign-up")]
RenderSignUp,
#[post("/sign-up")]
ProcessSignUp,
#[get("/log-in")]
RenderLogIn,
#[post("/log-in")]
ProcessLogIn,
#[get("/portal")]
RenderPortal,
}
#[derive(FrontLine)]
#[prefix("/api")]
enum ApiRoutes<'a> {
#[get("/users")]
GetAllUsers,
#[post("/users")]
CreateUser,
#[get("/users/{id}")]
GetUser { id: u32 },
#[get("/users/{id}/roles/{role}")]
GetUserRole { id: u32, role: &'a str },
#[put("/users/{id}/roles/{role}")]
UpdateUserRole { id: u32, role: &'a str },
}
#[derive(FrontLine)]
enum AllRoutes<'a> {
#[flatten]
Marketing(MarketingRoutes),
#[flatten]
Api(ApiRoutes<'a>),
}
// Construct an example http request, typically read from a socket.
let request = b"GET /api/users/42?a=b HTTP/1.1\r\n\r\nContent-Length: 12\r\n\r\nHello World!";
// Parse and resolve the route
let route = AllRoutes::resolve(request);
// For demonstration purposes, assert the resolved route matches expectations
assert!(matches!(route, Ok(RouterResult {
route: Some(AllRoutes::Api(ApiRoutes::GetUser { id: 42 })),
query: "a=b",
version: HttpVersion::OneOne,
head_and_body: b"Content-Length: 12\r\n\r\nHello World!",
})));
测试
使用标准cargo test
命令可以正常运行测试。
然而,为了保持一致性,我们建议使用docker化的测试环境。要使用docker化的测试环境,只需make
和docker
(即使本地没有安装rust)。只需运行以下命令。
make test
依赖项
~2.6–4MB
~74K SLoC