最近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":"请检查你提交的数据"}';
}
}