1 个不稳定版本
使用旧的Rust 2015
0.1.0 | 2018年9月22日 |
---|
#108 in #router
28KB
403 行
Http路由器
这是一个简单而表达性强的HTTP请求路由器,抽象到足以在稳定的Rust上与任何HTTP库一起使用。
主要功能:
- 具有完全类型参数的非常表达的路由
- 可以与任何http库一起使用
- 依赖项少(只有
regex
和lazy_static
)
入门(对于Hyper >= 0.12)
在你的Cargo.toml中
[dependencies]
http_router = "0.1"
在你的lib.rs或main.rs中
#[macro_use]
extern crate http_router;
在你的实现了Hyper Service
的结构体中
// Each handler must have the same return type
// A good candidate might be a Box<Future<Item = hyper::Response, Error = Error>>
// The cost of this macro is next to zero, so it's ok to call it on each request
let router = router!(
GET / => get_users,
GET /users => get_users,
POST /users => post_users,
PUT /users/{user_id: usize} => put_users,
DELETE /users/{user_id: usize} => delete_users,
GET /users/{user_id: usize}/transactions => get_transactions,
POST /users/{user_id: usize}/transactions => post_transactions,
PUT /users/{user_id: usize}/transactions/{hash: String} => put_transactions,
DELETE /users/{user_id: usize}/transactions/{hash: String} => delete_transactions,
_ => not_found,
);
let path = req.uri.path();
let ctx = Context { ... };
// This will return a value of the matched handler's return type
// E.g. the aforementioned Box<Future<Item = hyper::Response, Error = Error>>
router(ctx, req.method.into(), path)
一个包含处理程序实现的文件
// Params from a route become handlers' typed params.
// If a param's type doesn't match (e.g. you supplied `sdf` as a user id, that must be `usize`)
// then this route counts as non-matching
type ServerFuture = Box<Future<Item = hyper::Response, Error = Error>>;
pub fn get_users(context: &Context) -> ServerFuture {
...
}
pub fn post_users(context: &Context) -> ServerFuture {
...
}
pub fn put_users(context: &Context, user_id: usize) -> ServerFuture {
...
}
pub fn delete_users(context: &Context, id: usize) -> ServerFuture {
...
}
pub fn get_transactions(context: &Context, user_id: usize) -> ServerFuture {
...
}
pub fn post_transactions(context: &Context, user_id: usize) -> ServerFuture {
...
}
pub fn put_transactions(context: &Context, user_id: usize, hash: String) -> ServerFuture {
...
}
pub fn delete_transactions(context: &Context, user_id: usize, hash: String) -> ServerFuture {
...
}
pub fn not_found(_context: &Context) -> ServerFuture {
...
}
请参阅示例文件夹中的完整Hyper示例
与其他http库一起使用
默认情况下,此crate配置为与hyper >=0.12
一起使用。如果您想使用其他库,您可能想取消此crate的默认功能。因此,在您的Cargo.toml中
[dependencies]
http_router = config = { version = "0.1", default-features = false}
router!
宏独立于任何框架。然而,它返回一个接受3个参数的闭包 - context
、method
和 path
。您需要从您的http库中提供这3个参数。
context
是您用户定义类型的参数。例如,Context
。它将被传递到所有处理程序中。您可以在那里放置任何值,如数据库接口和http客户端。
method
是http_router
库中定义的Method类型的参数。它是GET
、POST
等之一。
path
是当前请求的路线的&str
。
一旦定义了这三个参数,您就可以使用router!
宏进行路由。
基准测试
目前,具有10个路由的路由器每次匹配大约需要50微秒。
依赖项
~2.2–4.5MB
~74K SLoC