1 个不稳定版本

0.1.2 2022年9月10日
0.1.1 2022年9月10日
0.1.0 2021年7月13日

#324 in HTTP服务器

MIT 协议

65KB
1.5K SLoC

功能

  • 仅标准库
  • 多线程线程池
  • 无宏
  • 基数树路由器

WIP

  • HTTP1.1
  • HTTP2
  • HTTP2

https://github.dev/hyperium/hyper

https://github.dev/hyperium/http

https://github.com/gin-gonic/gin#asciijson

axum

axum 是一个注重人体工程学和模块化的Web应用框架。

Build status Crates.io Documentation

有关此crate的更多信息,请参阅 crate文档

高级功能

  • 使用无宏API将请求路由到处理程序。
  • 使用提取器声明性解析请求。
  • 简单且可预测的错误处理模型。
  • 使用最少样板代码生成响应。
  • 充分利用 towertower-http 生态系统中的中间件、服务和工具。

特别是最后一点是 axum 与其他框架的不同之处。 axum 没有自己的中间件系统,而是使用 tower::Service。这意味着 axum 可以免费获得超时、跟踪、压缩、授权等功能。它还允许您与使用 hypertonic 编写的应用程序共享中间件。

重大变更

我们目前正在开发 axum 0.6,因此 main 分支包含重大变更。有关已发布到crates.io的内容和最新的变更日志,请参阅 0.5.x 分支。

使用示例

use axum::{
    routing::{get, post},
    http::StatusCode,
    response::IntoResponse,
    Json, Router,
};
use serde::{Deserialize, Serialize};
use std::net::SocketAddr;

#[tokio::main]
async fn main() {
    // initialize tracing
    tracing_subscriber::fmt::init();

    // build our application with a route
    let app = Router::new()
        // `GET /` goes to `root`
        .route("/", get(root))
        // `POST /users` goes to `create_user`
        .route("/users", post(create_user));

    // run our app with hyper
    // `axum::Server` is a re-export of `hyper::Server`
    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
    tracing::debug!("listening on {}", addr);
    axum::Server::bind(&addr)
        .serve(app.into_make_service())
        .await
        .unwrap();
}

// basic handler that responds with a static string
async fn root() -> &'static str {
    "Hello, World!"
}

async fn create_user(
    // this argument tells axum to parse the request body
    // as JSON into a `CreateUser` type
    Json(payload): Json<CreateUser>,
) -> impl IntoResponse {
    // insert your application logic here
    let user = User {
        id: 1337,
        username: payload.username,
    };

    // this will be converted into a JSON response
    // with a status code of `201 Created`
    (StatusCode::CREATED, Json(user))
}

// the input to our `create_user` handler
#[derive(Deserialize)]
struct CreateUser {
    username: String,
}

// the output to our `create_user` handler
#[derive(Serialize)]
struct User {
    id: u64,
    username: String,
}

您可以在 此示例 以及 示例目录 中的其他示例项目中找到。

有关更多示例,请参阅 crate文档

性能

axum 是建立在 hyper 之上的一层相对较薄的层,并且几乎没有增加开销。因此,axum 的性能与 hyper 相当。您可以在这里这里找到基准测试。

安全性

这个crate使用#![forbid(unsafe_code)]来确保所有内容都在100%安全的Rust中实现。

最低支持的Rust版本

axum的最低支持Rust版本是1.60。

示例

示例文件夹中包含了如何使用axum的多种示例。文档也提供了许多代码片段和示例。对于更完整的示例,请查看社区维护的展示教程

获取帮助

axum的repo中,我们也有一些示例,展示了如何将所有内容组合在一起。社区维护的展示教程也演示了如何在现实世界中使用axum。您也可以在Discord频道中提问或在问题中提出您的问题。

社区项目

请查看这里获取使用axum构建的社区维护crate和项目的列表。

贡献

🎈 感谢您的帮助,让我们改进这个项目!我们非常高兴有您的参与!我们有一个贡献指南,以帮助您参与axum项目。

许可

本项目采用MIT许可

贡献

除非您明确表示,否则您有意提交到axum的任何贡献都应按MIT许可,不附加任何其他条款或条件。

依赖项

~1.6–2.4MB
~51K SLoC