Boluo
这是一个简单易用的异步网络框架,借鉴axum
,基于tokio
和hyper
构建,目前缺乏文档和测试。
起因
在使用axum
的过程中,我遇到了两个问题:
- 错误和响应不分离:错误离开处理程序就变为响应,中间件无法对特定错误进行捕获,并将错误转为自己想要的响应格式。
- 多次创建服务副本:每次处理请求时,
axum
会多次对Service
进行克隆,这可能会导致一些中间件无法产生预计的行为。(案例:https://github.com/tokio-rs/axum/discussions/2520)。
上述两个问题使我放弃使用axum
,并自己创建一个网络框架。
示例
use boluo::http::StatusCode;
use boluo::response::IntoResponse;
use boluo::response::Response;
use boluo::route::{RouteError, RouteErrorKind, Router};
use boluo::server::Server;
use boluo::service::ServiceExt;
use boluo::BoxError;
use tokio::net::TcpListener;
#[tokio::main]
async fn main() {
let listener = TcpListener::bind("127.0.0.1:3000").await.unwrap();
let app = Router::new().mount(hello).or_else(handle_error);
Server::new(listener).run(app).await.unwrap();
}
#[boluo::route("/", method = "GET")]
async fn hello() -> Result<(), MyError> {
Err(MyError)
}
/// 错误处理
async fn handle_error(err: BoxError) -> Result<Response, BoxError> {
// 处理框架抛出的路由错误,并自定义响应方式
if let Some(e) = err.downcast_ref::<RouteError>() {
let status_code = match e.kind() {
RouteErrorKind::NotFound => StatusCode::NOT_FOUND,
RouteErrorKind::MethodNotAllowed => StatusCode::METHOD_NOT_ALLOWED,
};
return Ok((status_code, format!("{status_code}")).into_response()?);
}
if let Some(_) = err.downcast_ref::<MyError>() {
// 记录错误、转为响应等等
}
Err(err)
}
#[derive(Debug, thiserror::Error)]
#[error("some error message")]
struct MyError;
项目地址:
这是符合我个人喜好的rust网络框架,构建完成想要与大家分享,欢迎大家试用并提出意见或建议。使用方式可以参考examples
文件夹,目前例子不多,但是涵盖了一些简单的使用场景。
注:英文水平有限,所以仅有的文档是用中文编写的,并且后续的文档也将使用中文。
1
共 0 条评论, 1 页
评论区
写评论还没有评论