2个不稳定版本
0.2.0 | 2019年11月18日 |
---|---|
0.1.0 | 2019年11月5日 |
#22 in #http-router
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