2个不稳定版本

0.2.0 2019年11月18日
0.1.0 2019年11月5日

#22 in #http-router

MIT 许可证

23KB
334

Pathmaker

适用于任何HTTP库的通用路由。并不复杂。

使用方法

要使用此库,请在您的 Cargo.toml 中添加以下内容:

pathmaker = "0.1.0"

如果您想与特定的HTTP库一起使用,例如 hyper,请启用该功能

hyper = "0.12"
pathmaker = { version = "0.1", features = ["hyper"] }

然后,在您的代码中,构建一个路由器

extern crate hyper;
extern crate pathmaker;
extern crate failure;
extern crate futures;

use hyper::{Request, Response, Method, Body, Server};
use hyper::service::make_service_fn;
use hyper::header::CONTENT_LENGTH;
use pathmaker::hyper::Router;
use failure::Error;
use futures::prelude::*;

fn router() -> Router {
    let mut build = Router::build();
    build.get("/foo", |_, _| {
        let body = "Hello, world!";
        Box::new(futures::future::result(Response::builder()
            .header(CONTENT_LENGTH, body.len() as u64)
            .body(Body::from(body))
            .map_err(Error::from)
        ))
    });
    build.finish()
}

fn main() {
    let address = "0.0.0.0:8080".parse().unwrap();
    let server = Server::bind(&address)
        .serve(make_service_fn(|_| Ok::<_, hyper::Error>(router()))).map_err(|e| {
            eprintln!("error: {:?}", e);
        });
    // hyper::rt::run(server)
}

查询参数

通过在路径中使用 {} 来允许对查询参数的支持

// ...
fn router() -> Router {
    let mut build = Router::build();
    build.get("/foo", handler)
         .get("/hello/{}", hello_handler);
    build.finish()
}
// ...

然后,在处理程序中,您可以访问第二个参数的第一个元素以获取结果

//...
fn hello_handler(_: Request<Body>, params: Vec<String>) -> Box<dyn Future<Item = Response<Body>, Error = Error> + Send> {
    let body = format!("Hello, {}!", params[0]);
    Box::new(futures::future::result(
        Response::builder()
            .header(CONTENT_LENGTH, body.len() as u64)
            .body(Body::from(body))
            .map_err(Error::from)
    ))
}
// ...

可以通过格式过滤查询参数

  • {}{:string} (默认): 匹配除 / 字符之外的所有内容。
  • {:int}: 正数或负数。
  • {:uint}: 只是一个数字,不允许有符号。
  • {:uuid}: 一个UUID,格式为8-4-4-4-12。

如果需要,可以添加更多。

路由评估

从上到下评估路由。使用第一个匹配的路由。

依赖项

~4.5–7MB
~128K SLoC