#http-router #router #http #hyper #http-request

http_router_alt

这是一个简单且表达力强的 HTTP 请求路由器,足够抽象,可以在稳定的 Rust 上与任何 HTTP 库一起使用。

1 个不稳定版本

使用旧的 Rust 2015

0.2.0 2019年11月19日

#http-router 中排名第 11

MIT 许可证

28KB
403

Http 路由器

这是一个简单且表达力强的 HTTP 请求路由器,足够抽象,可以在稳定的 Rust 上与任何 HTTP 库一起使用。

主要特性:

  • 具有完全类型参数的非常表达的路由
  • 可用于任何 HTTP 库
  • 依赖项少(只有 regexlazy_static

入门指南(适用于 Hyper >= 0.12)

在你的 Cargo.toml 中

[dependencies]
http_router = "0.1"

在你的 lib.rs 或 main.rs 中

#[macro_use]
extern crate http_router;

在你的实现 Hyper Service 的 struct 中

// 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 个参数的闭包 - contextmethodpath。您需要从您的 http 库提供这三个参数。

context 是您的用户定义类型的参数。例如,Context。它将作为第一个参数传递给所有您的处理程序。您可以在其中放置任何值,例如数据库接口和 HTTP 客户端。

method 是在 http_router 库中定义的 Method 类型的参数。它是 GETPOST 等之一。

path 是一个 &str,它是请求的当前路由。

一旦定义了这三个参数,您就可以使用 router! 宏进行路由。

基准测试

目前,具有 10 个路由的路由器进行一次匹配大约需要 50 微秒

依赖项

~2.2–4.5MB
~74K SLoC