当前位置: 首页 > news >正文

Rust Web框架Axum学习指南之响应和异常封装

一、添加依赖

接上一节内容,这里添加两个依赖包:serde_jsonthiserror

[package]
name = "axum-admin"
version = "0.1.0"
edition = "2024"[dependencies]
axum = "0.8.4"
tokio = { version = "1.47.1", features = ["full"] }
serde = { version = "1.0.219", features = ["derive"] }
tracing-subscriber = "0.3.19"
# 新增的依赖
serde_json = "1.0.142"
thiserror = "2.0.14"

二、封装响应

里需要定一个响应的结构体,让结构提实现IntoResponsetrait 就可以了,处理程序可以返回任何实现了 IntoResponse 的东西,它将被自动转换为响应。

use axum::http::StatusCode;
use axum::Json;
use axum::response::{IntoResponse, Response};
use serde::Serialize;
use serde_json::json;const SUCCESS_CODE: i32 = StatusCode::OK.as_u16() as i32;
const SUCCESS_MESSAGE: &str = "操作成功";#[derive(Debug, Serialize)]
pub struct Message<T> {code: i32,data: Option<T>,msg: String,
}impl<T: Serialize> IntoResponse for Message<T> {fn into_response(self) -> Response {let val = json!(self);Json(val).into_response()}
}impl<T> Message<T> {pub fn success(data: T) -> Self {Self {code: SUCCESS_CODE,data: Some(data),msg: SUCCESS_MESSAGE.to_owned(),}}pub fn error(code: i32, msg: String) -> Self {Self {code,data: None,msg,}}
}

三、异常封装

这里需要使用 thiserror,可以定一个异常枚举,存放会用的异常定义

use axum::http::StatusCode;
use axum::response::{IntoResponse, Response};
use thiserror::Error;
use crate::message::Message;// 类型别名
pub type MessageResult<T> = Result<Message<T>, SystemError>;#[derive(Error, Debug)]
pub enum SystemError {#[error("认证异常: {0}")]AuthError(String),#[error("服务异常:{0}")]UnknownError(String)
}impl IntoResponse for SystemError {fn into_response(self) -> Response {let (status_code, message) = match &self {SystemError::AuthError(msg) => (StatusCode::UNAUTHORIZED, msg.to_string()),SystemError::UnknownError(msg) => (StatusCode::INTERNAL_SERVER_ERROR, msg.to_string()),};(StatusCode::OK, Message::<()>::error(status_code.as_u16() as i32, message)).into_response()}
}

四、使用案例

在上一节例子中添加两个路由:

let app = Router::new().route("/", get(root)).route("/user", get(get_user)) // 获取用户.route("/user_err", get(get_user_err)) // 异常测试.route("/users", post(create_user));

控制器定义如下:

async fn get_user() -> MessageResult<User> {Ok(Message::success(User{id: 10,username: "Long".to_string()}))
}async fn get_user_err() -> MessageResult<User> {Err(SystemError::UnknownError("获取用户信息异常".to_string()))
}

最后启动项目,测试接口就可以了。

五、总结

下一篇会讲一下 axum 的提取器的使用(毕竟 CRUD 常用呢)。

http://www.xdnf.cn/news/1387171.html

相关文章:

  • websocket建立连接过程
  • AI供应链优化+AI门店排班:蜜雪冰城降本20%、瑞幸提效的AI商业落地实战
  • 港科大开放世界长时域具身导航!LOVON:足式机器人开放词汇目标导航
  • LeetCode Hot 100 Python (1~10)
  • 1 分钟 Maya 动画渲染要多久?5 天还是 5 小时
  • linux系统学习(15.启动管理)
  • 第一百零二章:AI的“未来电影制片厂CEO”:多模态系统落地项目实战(完整 AI 视频创作平台)
  • 极飞科技AI智慧农业实践:3000亩棉田2人管理+产量提15%,精准灌溉与老农操作门槛引讨论
  • 组件的生命周期:`useEffect` 的威力与副作用处理
  • 随机森林的 “Bootstrap 采样” 与 “特征随机选择”:如何避免过拟合?(附分类 / 回归任务实战)
  • 华为云CCE的Request和Limit
  • Ethercat主从站移植时的问题记录(二)—无法进入OP状态且从站PDI中断不触发
  • 什么是Jmeter? Jmeter工作原理是什么?
  • linux上安装methylkit -- 安全下车版 (正经版: Linux环境下安装methylKit的实践与避坑指南)
  • springboot java开发的rocketmq 顺序消息保证
  • CAN总线(Controller Area Network Bus)控制器局域网总线(二)
  • 无人机图传模块原理及作用——开启飞行视野的关键技术
  • 第二阶段WinForm-9:委托复习
  • 应用转生APP:无需Root权限的应用双开和Xposed模块加载工具
  • 计算机是如何运行的
  • [AI人脸替换] docs | 环境部署指南 | 用户界面解析
  • c++ template
  • OpenCSG月度更新2025.8
  • 电影交流|基于SprinBoot+vue的电影交流平台小程序系统(源码+数据库+文档)
  • C++基础(④链表反转(链表 + 迭代 / 递归))
  • 公司内网部署离线deepseek+docker+ragflow本地模型实战
  • SpringBoot整合Spring WebFlux弃用自带的logback,使用log4j2,并启动异步日志处理
  • Python计算点云的均值、方差、标准差、凸点(顶点)、质心和去中心化
  • Docker03-知识点整理
  • Go Vendor 和 Go Modules:管理和扩展依赖的最佳实践