2 个不稳定版本
0.6.1 | 2022年9月12日 |
---|---|
0.6.0 |
|
0.5.0 | 2022年9月12日 |
#27 in #hyper-server
17KB
241 行
Hyper Router
这个 cargo 是一个对优秀的 Hyper HTTP 库的小扩展。它基本上是添加了定义路由到请求处理器并按请求路径查询处理器的功能。
用法
要使用这个库,只需将其添加到你的依赖中。
hyper-routing = "0.6.1"
hyper = { version = "0.14", features = ["full"] }
tokio = { version = "1", features = ["full"] }
futures-util = "0.3"
pretty_env_logger = "0.4"
到你的依赖。
#![deny(warnings)]
use std::task::{Context, Poll};
use futures_util::future;
use hyper::service::Service;
use hyper::{Body, Method, Request, Response, Server};
use hyper::header::{CONTENT_LENGTH, CONTENT_TYPE};
use hyper_routing::{Route, RouterBuilder, RouterService};
pub struct MakeSvc;
impl<T> Service<T> for MakeSvc {
type Response = RouterService;
type Error = std::io::Error;
type Future = future::Ready<Result<Self::Response, Self::Error>>;
fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
Ok(()).into()
}
fn call(&mut self, _: T) -> Self::Future {
future::ok(router_service())
}
}
fn request_handler(_: Request<Body>) -> Response<Body> {
let body = "Hello World";
Response::builder()
.header(CONTENT_LENGTH, body.len() as u64)
.header(CONTENT_TYPE, "text/plain")
.body(Body::from(body))
.expect("Failed to construct the response")
}
fn router_service() -> RouterService {
let router = RouterBuilder::new()
.add(Route::get("/hello").using(request_handler))
.add(Route::from(Method::PATCH, "/world").using(request_handler))
.build();
RouterService::new(router)
}
#[tokio::main]
async fn main() {
pretty_env_logger::init();
// We'll bind to 127.0.0.1:3000
let addr = "0.0.0.0:3000".parse().unwrap();
let server =
Server::bind(&addr).serve(MakeSvc);
// Run this server for... forever!
if let Err(e) = server.await {
eprintln!("server error: {}", e);
}
}
此代码将启动 Hyper 服务器并将使用路由器以找到请求的处理器。我们创建 Route
,以便当我们访问路径 /greet
时,basic_handler
处理器将被调用。
注意事项
- 您可以将路径指定为正则表达式,这样您就可以匹配您想要的任何路径。
- 如果您有匹配多个路径的请求,则将选择首先
add
的那个。 这个库处于开发初期阶段,可能会有破坏性的更改。- 由于这个库似乎很受欢迎,所以我不会进行兼容性破坏性的更改。
进一步开发
- 添加通过查询参数区分请求的能力。
期待您的反馈
我创建了这个小工具来帮助自己学习 Rust,并避免使用像 Iron 或 rustful 这样的大框架。我只是想保持简单。
显然,我可能会犯一些错误或做出糟糕的设计选择,所以我正在等待您的反馈!请通过 moriturius at GMail 联系我。您也可以在 项目的错误跟踪器 中创建一个问题。
依赖项
~6.5–9MB
~146K SLoC