axum错误处理

561287
2022/02/17 08:18:41

最近TG 群很多朋友讨论到,在接收 JSON 数据时,如何对用户错误提交的数据回复自定义的信息。在axum 官方示例中,有一个通过自定义 extractor 的示例,同时axum 文档里有一篇专门介绍的错误处理的文档。

本章将简化官方的 extractor 以及结合 nginx 来实现。

自定义 extractor

extractor 的定义

axum 官方已经提供了很多 extractor,其中包括 axum::Json。现在,我们要实现自己的 Json extractor——当然,为了避免混乱,建议取别的名字,比如MyJson等。

如果你对中间件还有印象,你会发现这段代码何其的熟悉。

在 handler 中使用

// src/handler.rs
use crate::extract::Json;
use serde::Deserialize;

#[derive(Deserialize, Debug)]
pub struct User {
    pub username: String,
    pub email: String,
}
// 使用的是我们自定义的Json
pub async fn login(Json(user): Json<User>) {
    dbg!(&user);
}

nginx

我们可以使用 nginx 来反代 axum 应用,并根据不同的 HTTP 响应码来定义不同的 JSON 响应:

server {
    listen 443 ssl;
    server_name axum.rs;

    error_page 400 401 403 404 405 500 501 502 503 504 /msg.json;
    location /msg.json {
        internal;
        default_type application/json;
        charset utf-8;
        return 400 '{"error":"请检查你提交的数据"}';
    }
}