常见错误处理
自定义错误类型
rust
▶ Runuse axum::{
response::{IntoResponse, Response},
http::StatusCode,
Json,
};
use serde_json::json;
#[derive(Debug)]
enum AppError {
NotFound(String),
BadRequest(String),
Internal(String),
DatabaseError(sqlx::Error),
}
impl IntoResponse for AppError {
fn into_response(self) -> Response {
match self {
AppError::NotFound(msg) => {
(StatusCode::NOT_FOUND, Json(json!({"error": msg}))).into_response()
}
AppError::BadRequest(msg) => {
(StatusCode::BAD_REQUEST, Json(json!({"error": msg}))).into_response()
}
AppError::Internal(msg) => {
(StatusCode::INTERNAL_SERVER_ERROR, Json(json!({"error": msg}))).into_response()
}
AppError::DatabaseError(err) => {
(StatusCode::INTERNAL_SERVER_ERROR, Json(json!({"error": err.to_string()}))).into_response()
}
}
}
}
impl From<sqlx::Error> for AppError {
fn from(err: sqlx::Error) -> Self {
AppError::DatabaseError(err)
}
}练习
练习 1:用户认证 API
实现一个用户认证系统:
- 注册(用户名 + 密码)
- 登录(返回 JWT)
- 获取当前用户信息
练习 2:文件上传服务
创建一个文件上传 API:
- 支持 multipart/form-data
- 保存上传的文件
- 提供文件下载接口
练习 3:分页列表 API
实现带分页的列表接口:
?page=1&limit=10- 返回总数和分页信息
小结
本章我们学习了:
- ✅ Axum 基础用法
- ✅ 路由和提取器
- ✅ 响应处理
- ✅ REST API 实现
- ✅ 中间件
- ✅ 静态文件服务
- ✅ Actix-web 示例
- ✅ 数据库集成
Web 框架选择
| 需求 | 推荐框架 |
|---|---|
| 新项目 | Axum |
| 高性能 | Actix-web |
| 易用性 | Rocket |
| 微服务 | Warp |