axum

简介

axum是一个基于tokio的web框架。

例子

Hello World

先在cargo.toml中添加axum依赖,然后运行下面代码

use axum::{
    routing::get,
    Router,
};

#[tokio::main] // tokio::main宏用于启动异步运行时
async fn main() {
    // 创建一个app
    let app = Router::new()
        // route的第一个参数是路径,第二个参数是方法路由,其参数是处理函数
        .route("/", get(|| async { "Hello, World!" })); // 这里处理函数是闭包

    // 设置监听地址
    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    // 启动服务
    axum::serve(listener, app).await.unwrap();
}
curl http://localhost:3000

可以看到Hello, World!,但是后台并没有输出,因为没有日志

日志

在cargo.toml添加tracing和tracing_subcriber依赖,然后代码修改如下

use axum::{
    routing::get,
    Router,
};

#[tokio::main] // tokio::main宏用于启动异步运行时
async fn main() {
    // 初始化tracing日志
    tracing_subscriber::fmt::init();
    // 创建一个app
    let app = Router::new()
        // route的第一个参数是路径,第二个参数是方法路由,其参数是处理函数
        .route("/", get(|| async { "Hello, World!" })); // 这里处理函数是闭包

    // 设置监听地址
    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    // 启动服务
    axum::serve(listener, app).await.unwrap();
}

handler

use axum::{
    routing::get,
    Router,
};

#[tokio::main]
async fn main() {
    let app = Router::new()
        // route的第一个参数是路径,第二个参数是处理函数
        // 处理函数可以是闭包
        .route("/", get(|| async { "Hello, World!" }))
        // 也可以是普通async函数
        .route("/foo", get(get_foo).post(post_foo))
        .route("/json", get(handle_json);

    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

async fn get_foo() {}
async fn post_foo() {}
async fn handle_json() -> Json<Value> {}