#prefix-tree #hyper #hyper-http #tree #trie #prefix #router

no-std hyper-tree-router

使用前缀树(trie)进行路径查找的Hyper http库的路由中间件

1 个不稳定版本

0.1.0 2022年10月23日

#2028 in 数据结构

MITGPL-3.0-or-later

19KB
410 代码行

Hyper Tree Router

使用前缀树(trie)进行路径查找的Hyper http库的路由中间件。它能够为指定的请求路径定义路由和处理程序

用法

要使用此库,请将其添加到您的 Cargo.toml

hyper = { version = "^0.14", features = ["http1", "server", "tcp"] }
hyper-tree-router = "^0.1"

然后您可以定义如下给定路由的处理程序。以下代码创建两个 Route 并为它们创建一个Hyper服务器。

/ 使用 hello_handler,当您打开服务器时将返回 "Hello world"。

/user/:user_id/home 使用 user_handlerurl_params 包含一个包含URL参数的哈希表,您可以查找并响应这些参数。

use hyper::{
    header::{CONTENT_LENGTH, CONTENT_TYPE},
    Body, Request, Response, Server,
};
use hyper_tree_router::{Route, RouterBuilder, UrlParams};

fn plain_text_response(body: String) -> Response<Body> {
    Response::builder()
        .header(CONTENT_LENGTH, body.len() as u64)
        .header(CONTENT_TYPE, "text/plain")
        .body(Body::from(body))
        .expect("Failed to construct response")
}

fn user_handler(url_params: UrlParams, _: Request<Body>) -> Response<Body> {
    let body = format!(
        "user: {}",
        url_params
            .captures
            .get(":user_id")
            .unwrap_or(&"unknown user".to_string())
    );
    plain_text_response(body)
}

fn hello_handler(_: UrlParams, _: Request<Body>) -> Response<Body> {
    plain_text_response("Hello World".to_string())
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
    let addr = "0.0.0.0:8080".parse().unwrap();
    let router = RouterBuilder::new()
        .route(Route::url("/user/:user_id/home").get(user_handler))
        .route(Route::url("/").get(hello_hanlder))
        .build();
    let server = Server::bind(&addr).serve(router);
    println!("Listening on http://{}", addr);
    server.await?;
    Ok(())
}

依赖项

~5–16MB
~157K SLoC