Web后端框架
2025年6月21日大约 2 分钟hyperlanewebrust
Hyperlane 是一个轻量级且高性能的 Rust HTTP 服务器库,旨在简化网络服务开发。它支持 HTTP 请求解析、响应构建和 TCP 通信,非常适合构建现代 Web 服务。此外,它还支持请求和响应中间件、WebSocket 和 Server-Sent Events (SSE),从而实现灵活高效的实时通信。Hyperlane 使用纯 Rust 和标准库构建,提供跨 Windows、Linux 和 macOS 的真正跨平台兼容性,且所有平台上的 API 体验一致,依托 Tokio 的异步运行时实现无缝网络通信,无需特定于平台的依赖。
安装
要使用此 crate,可以运行以下命令:
cargo add hyperlane
快速开始
git clone https://github.com/eastspire/hyperlane-quick-start.git
使用示例
use hyperlane::*;
async fn request_middleware(ctx: Context) {
let socket_addr: String = ctx.get_socket_addr_or_default_string().await;
ctx.set_response_header(SERVER, HYPERLANE)
.await
.set_response_header(CONNECTION, KEEP_ALIVE)
.await
.set_response_header(CONTENT_TYPE, TEXT_PLAIN)
.await
.set_response_header("SocketAddr", socket_addr)
.await;
}
async fn response_middleware(ctx: Context) {
let _ = ctx.send().await;
}
#[methods(get, post)]
async fn root_route(ctx: Context) {
ctx.set_response_status_code(200)
.await
.set_response_body("Hello hyperlane => /")
.await;
}
#[ws]
#[get]
async fn ws_route(ctx: Context) {
let key: String = ctx.get_request_header(SEC_WEBSOCKET_KEY).await.unwrap();
let request_body: Vec<u8> = ctx.get_request_body().await;
let _ = ctx.set_response_body(key).await.send_body().await;
let _ = ctx.set_response_body(request_body).await.send_body().await;
}
#[post]
async fn sse_pre_hook(ctx: Context) {
let _ = ctx
.set_response_header(CONTENT_TYPE, TEXT_EVENT_STREAM)
.await
.set_response_status_code(200)
.await
.send()
.await;
}
async fn sse_post_hook(ctx: Context) {
let _ = ctx.closed().await;
}
#[pre_hook(sse_pre_hook)]
#[post_hook(sse_post_hook)]
async fn sse_route(ctx: Context) {
for i in 0..10 {
let _ = ctx
.set_response_body(format!("data:{}{}", i, HTTP_DOUBLE_BR))
.await
.send_body()
.await;
}
}
async fn dynamic_route(ctx: Context) {
let param: RouteParams = ctx.get_route_params().await;
panic!("Test panic {:?}", param);
}
async fn on_ws_connected(ctx: Context) {
let _ = ctx.set_response_body("connected").await.send_body().await;
}
fn error_handler(error: String) {
eprintln!("{}", error);
let _ = std::io::Write::flush(&mut std::io::stderr());
}
#[tokio::main]
async fn main() {
let server: Server = Server::new();
server.host("0.0.0.0").await;
server.port(60000).await;
server.enable_nodelay().await;
server.disable_linger().await;
server.http_line_buffer_size(4096).await;
server.ws_buffer_size(4096).await;
server.error_handler(error_handler).await;
server.on_ws_connected(on_ws_connected).await;
server.before_ws_upgrade(request_middleware).await;
server.request_middleware(request_middleware).await;
server.response_middleware(response_middleware).await;
server.route("/", root_route).await;
server.route("/ws", ws_route).await;
server.route("/sse", sse_route).await;
server.route("/dynamic/{routing}", dynamic_route).await;
server
.route("/dynamic/routing/{file:^.*$}", dynamic_route)
.await;
server.run().await.unwrap();
}
许可证
此项目基于 MIT 许可证授权。详细信息请查看 license 文件。
贡献
欢迎贡献!请提交 issue 或创建 pull request。
联系方式
如有任何疑问,请联系作者:[email protected]。