axum
axum
是一个专注于人体工程学和模块化的Web应用框架。
关于此crate的更多信息可以在crate文档中找到。
主要特性
- 使用无宏API将请求路由到处理程序。
- 使用提取器声明式解析请求。
- 简单且可预测的错误处理模型。
- 以最少的样板代码生成响应。
- 充分利用
tower
和tower-http
生态系统的中间件、服务和实用工具。
特别是最后一点是axum
区别于其他框架的地方。axum
没有自己的中间件系统,而是使用tower::Service
。这意味着axum
可以免费获得超时、跟踪、压缩、授权等功能。它还使您能够与使用hyper
或tonic
编写的应用程序共享中间件。
使用示例
use axum::{
routing::{get, post},
http::StatusCode,
Json, Router,
};
use serde::{Deserialize, Serialize};
#[tokio::main]
async fn main() {
// 初始化跟踪
tracing_subscriber::fmt::init();
// 构建带有路由的应用程序
let app = Router::new()
// `GET /` 指向 `root`
.route("/", get(root))
// `POST /users` 指向 `create_user`
.route("/users", post(create_user));
// 使用hyper运行我们的应用,在全局3000端口上监听
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
// 响应静态字符串的基本处理程序
async fn root() -> &'static str {
"Hello, World!"
}
async fn create_user(
// 这个参数告诉axum将请求体解析为
// JSON格式的`CreateUser`类型
Json(payload): Json<CreateUser>,
) -> (StatusCode, Json<User>) {
// 在这里插入您的应用程序逻辑
let user = User {
id: 1337,
username: payload.username,
};
// 这将被转换为JSON响应
// 状态码为`201 Created`
(StatusCode::CREATED, Json(user))
}
// 我们的`create_user`处理程序的输入
#[derive(Deserialize)]
struct CreateUser {
username: String,
}
// 我们的`create_user`处理程序的输出
#[derive(Serialize)]
struct User {
id: u64,
username: String,
}
在crate文档中可以找到更多示例。
性能
axum
是hyper
之上的一个相对轻量级的层,几乎不增加额外开销。因此,axum
的性能与hyper
相当。您可以在这里和这里找到基准测试。
安全性
这个crate使用#![forbid(unsafe_code)]
来确保所有内容都是用100%安全的Rust实现的。
最低支持的Rust版本
axum的MSRV是1.66。
示例
examples文件夹包含了如何使用axum
的各种示例。docs也提供了许多代码片段和示例。对于完整的示例,请查看社区维护的展示项目或教程。
获取帮助
在axum
的仓库中,我们还有许多示例展示了如何将所有内容组合在一起。社区维护的展示项目和教程也演示了如何将axum
用于实际应用。您也可以在Discord频道中提问或开启一个讨论。
社区项目
在这里可以找到使用axum
构建的社区维护的crate和项目列表。
贡献
🎈 感谢您帮助改进项目!我们非常高兴有您的参与!我们有一个贡献指南来帮助您参与axum
项目。
许可证
本项目采用MIT许可证。
贡献
除非您明确声明,否则您有意提交以包含在axum
中的任何贡献均应按MIT许可证授权,无任何附加条款或条件。