当前位置: 首页 > 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.dtcms.com/a/356718.html

相关文章:

  • 如何备份 TECNO 手机上的短信
  • 云手机的安全性如何?
  • 云手机技术中都有着哪些局限性?
  • 国际期货Level2分时Tick历史行情数据处理分析
  • 关于 etree 的解析
  • 【c++题解】经典题目:带修改的 LIS 问题——CF650D Zip-line
  • 【修复软件】【缺少dll、ocx】加载失败报错无法运行注册老软件崩溃解决修复任何软件等通用方法
  • 中文PDF解析工具测评与选型指南
  • MemoryVLA:让机器人拥有“记忆“的视觉-语言-动作模型
  • 第2.1节:AI大模型之GPT系列(GPT-3、GPT-4、GPT-5)
  • 深入解析Qt节点编辑器框架:高级特性与性能优化(四)
  • 性能测试-jmeter7-元件提取器
  • 达梦数据库-归档日志(一)
  • 达梦数据库-数据文件 (二)
  • 【ShiMetaPi M4-R1】上手:RK3568B2 |开源鸿蒙(OpenHarmony) 开发板上手指南
  • dm8_静默安装简单快速
  • 第一百零二章:AI的“未来电影制片厂CEO”:多模态系统落地项目实战(完整 AI 视频创作平台)
  • mongoDB学习(docker)
  • MYSQL速通(2/5)
  • 【开题答辩全过程】以 基于Spring Boot的网上家庭烹饪学习系统的设计与实现为例,包含答辩的问题和答案
  • 软考-系统架构设计师 办公自动化系统(OAS)详细讲解
  • LeetCode 完全背包 279. 完全平方数
  • 小程序版碰一碰发视频:源码搭建与定制化开发的源头技术解析
  • Java开发MongoDB常见面试题及答案
  • [TG开发]与Reids集成
  • five86: 2靶场渗透
  • LangChain实战(二):环境搭建与Hello World(国内开源模型版)
  • 互联网大厂Java面试:从基础到微服务云原生的深度解析
  • web3简介
  • 克隆态驱动给用户态使用流程