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

用AxumStatusCode细化Rust Web标准格式响应

构建统一响应

定义

/// 统一响应类型
pub type ApiResult<T> = Result<(StatusCode, Json<T>), (StatusCode, Json<ErrorResponse>)>;/// 错误消息响应体
#[derive(Serialize, ToSchema)]
pub struct ErrorResponse {pub message: String,
}impl ErrorResponse {pub fn error(status: StatusCode, message: impl Into<String>) -> (StatusCode, Json<Self>) {(status,Json(ErrorResponse {message: message.into(),}),)}
}

使用

成功响应:

无需返回数据的操作成功时通常响应状态码即可,响应StatusCode::OK时用Json()包裹数据

use axum::http::StatusCode;
use axum::Extension;
use axum::extract::State;
pub async fn update_example(State(state): State<AppState>,Extension(user): Extension<User>,
) -> ApiResult<()> {Ok((StatusCode::NO_CONTENT, Json(())))
}

成功响应码在响应头中,如果有数据是以下格式

{"id":1,"name":"张三"}

失败响应:

失败响应通常包含失败提示信息

let total = paginator.num_items().await.map_err(|err| {ErrorResponse::error(StatusCode::INTERNAL_SERVER_ERROR,format!("Failed to count records: {}", err),)})?;

错误响应码在响应体中,如果有数据是以下格式

{"message":"无效的用户ID"}

问题

为什么不使用以下格式?

code:200
data:[]
message:"错误"

将响应码放在响应头的优点:

    1. 符合RESTful规范:严格遵循HTTP协议标准。
    1. 浏览器友好:原生支持状态码处理,如401会自动跳转登录页。
    1. 缓存友好:CDN和浏览器能正确缓存不同状态码的响应。
    1. Json友好:前端直接判断响应码然后进行序列化;如果在响应体中定义code需要先序列化再判断响应结果,无论响应成功和失败都会在响应头中显示200状态码。

CRUD常见响应码

Create 创建

成功响应:

  • 201 Created - 资源创建成功

失败响应:

  • 400 Bad Request - 请求体无效(如字段验证失败)
  • 409 Conflict - 资源已存在(如唯一键冲突)
  • 422 Unprocessable Entity - 语义错误(如格式正确但业务规则不满足)

Read 读取

成功响应

  • 200 OK - 资源获取成功
  • 204 No Content - 成功但无内容(如查询结果为空列表)

失败响应

  • 401 Unauthorized - 未认证
  • 403 Forbidden - 无权限访问
  • 404 Not Found - 资源不存在
  • 410 Gone - 资源已被永久删除

Update 更新

成功响应

  • 200 OK - 返回更新后的完整资源
  • 204 No Content - 成功但无需返回内容(常见于 PUT/PATCH)

失败响应

  • 400 Bad Request - 无效的更新数据
  • 403 Forbidden - 无权修改该资源
  • 404 Not Found - 要更新的资源不存在
  • 412 Precondition Failed - 条件请求失败(如版本冲突)

Delete 删除

成功响应

  • 204 No Content - 删除成功(推荐不返回内容)
  • 200 OK - 删除成功并返回被删除的资源(较少用)

失败响应

  • 403 Forbidden - 无权删除
  • 404 Not Found - 要删除的资源不存在
  • 423 Locked - 资源被锁定

AxumStatusCode所有响应码

1xx:信息响应

状态码名称类型含义/用途说明
100Continue信息提示初步请求已接受,客户端应继续发送请求主体。常用于带 Expect: 100-continue 的请求。
101Switching Protocols协议切换服务器同意客户端更改协议(如从 HTTP 升级为 WebSocket)。
102Processing正在处理WebDAV 扩展,服务器已接受但尚未完成处理。
2xx:成功响应
状态码名称类型含义/用途说明
200OK成功请求成功且返回内容(最常见)。
201Created创建成功成功创建了资源(如 POST 创建用户)。
202Accepted接受处理请求已接受,但未完成处理(异步操作常见)。
203Non-Authoritative Information非授权信息返回的信息来自第三方源而非原始服务器。
204No Content无内容请求成功但无返回内容(常用于 DELETE)。
205Reset Content重置内容请求成功,请客户端重置表单或视图。
206Partial Content部分内容支持 HTTP 分块下载(Range 请求)。
207Multi-Status多状态WebDAV 扩展,返回多个状态(XML)。
208Already Reported已报告WebDAV 扩展,避免重复报告。
226IM Used实体操作成功返回对资源的某种变换(如增量更新)。

3xx:重定向

状态码名称类型含义/用途说明
300Multiple Choices多种选择请求有多种可选响应。
301Moved Permanently永久重定向资源已永久移动。客户端应更新地址。
302Found临时重定向资源临时移动。旧客户端行为与规范不完全一致。
303See Other查看其他位置应使用 GET 获取资源(常用于 POST 后跳转)。
304Not Modified未修改缓存验证响应,无需重新下载资源。
305Use Proxy使用代理已废弃,指定使用代理(不推荐使用)。
307Temporary Redirect临时重定向与 302 类似,但强制使用原请求方法。
308Permanent Redirect永久重定向与 301 类似,但强制使用原请求方法。

4xx:客户端错误

状态码名称类型含义/用途说明
400Bad Request请求格式错误请求无效,可能参数缺失或格式错误。
401Unauthorized未授权缺乏身份验证信息或 Token 无效。
402Payment Required需付费预留状态码,尚未广泛使用。
403Forbidden被禁止有效身份但无权限。
404Not Found资源不存在请求的资源未找到。
405Method Not Allowed方法不被允许请求方法不支持当前资源。
406Not Acceptable不可接受请求的内容类型不符合服务端设置。
407Proxy Authentication Required代理需身份验证与 401 类似,但用于代理认证。
408Request Timeout请求超时客户端未及时发送完整请求。
409Conflict冲突请求与服务器资源状态冲突(如并发更新)。
410Gone已永久删除资源永久不可用,服务器不再维护。
411Length Required长度缺失需指定 Content-Length。
412Precondition Failed前提条件失败请求头中的某些条件不满足。
413Payload Too Large载荷过大请求体超过服务器处理能力。
414URI Too LongURI 过长请求路径超过限制。
415Unsupported Media Type媒体类型不支持Content-Type 不被接受。
416Range Not Satisfiable范围请求无效请求的 Range 无效。
417Expectation Failed期望失败Expect 请求头指定的内容无法被满足。
418I’m a teapot我是茶壶彩蛋状态码,来自愚人节 RFC2324。
421Misdirected Request请求方向错误请求被发送到错误的服务器实例。
422Unprocessable Entity无法处理实体请求格式正确但语义错误(常用于表单校验失败)。
423Locked资源被锁定WebDAV 扩展。
424Failed Dependency依赖失败前序请求失败,导致当前操作失败。
425Too Early太早发出请求请求过早,可能会重放。
426Upgrade Required需要升级协议客户端需升级协议(如 TLS)。
428Precondition Required要求前提条件需附带条件请求(如 If-Match 头)。
429Too Many Requests请求过多触发限流策略。
431Request Header Fields Too Large请求头太大请求头字段过多或过长。
451Unavailable For Legal Reasons法律原因不可用被审查或屏蔽(如因 GDPR、DMCA 等法律)。

5xx:服务器错误

状态码名称类型含义/用途说明
500Internal Server Error服务器内部错误通用错误,服务器出错但无法具体说明。
501Not Implemented未实现请求的方法未被支持。
502Bad Gateway网关错误代理服务器从上游返回无效响应。
503Service Unavailable服务不可用服务器过载或维护中。
504Gateway Timeout网关超时代理等待上游超时。
505HTTP Version Not SupportedHTTP版本不支持不支持请求使用的 HTTP 协议版本。
506Variant Also Negotiates协议协商失败服务端配置错误,不能选择合适的响应变体。
507Insufficient Storage存储空间不足WebDAV 扩展,服务器无法存储资源。
508Loop Detected检测到循环WebDAV 扩展,检测到无限循环。
510Not Extended扩展未提供需进一步扩展请求。
511Network Authentication Required需网络认证例如 Wi-Fi 登录门户页拦截。
http://www.xdnf.cn/news/666739.html

相关文章:

  • 动态防御新纪元:AI如何重构DDoS攻防成本格局
  • Spring Boot微服务架构(六):伪装的微服务有哪些问题?
  • npm error Cannot find module ‘negotiator‘ 的处理
  • 从Node.js到Go:如何从NestJS丝滑切换并爱上Sponge框架
  • Siege:开源的 HTTP/FTP 压力测试与基准评估工具!全参数详细教程!Kali Linux教程!
  • deepseek开源资料汇总
  • 34. 自动化测试开发之使用oracle连接池实现oracle数据库操作
  • 鸿蒙OSUniApp 开发的商品筛选器与排序功能#三方框架 #Uniapp
  • mediapipe标注视频姿态关键点
  • LVS 负载均衡群集
  • Reactor和Proactor
  • Docker部署Spark大数据组件
  • 【Java项目实战】智能截图工具V2.0:集成Tesseract OCR实现中英文识别功能完整开发教程
  • 【Qt开发】多元素控件
  • JavaScript性能优化全景指南
  • QT 框架学习笔记
  • Elasticsearch性能优化全解析
  • uni-app(6):Vue3语法基础下
  • Nginx 性能优化全解析:从进程到安全的深度实践
  • 【JavaScript 性能优化方法】
  • 【前端】【Vue3】vue3性能优化总结
  • MySQL 窗口函数深度解析:语法、应用场景与性能优化
  • day 23 机器学习管道(pipeline)
  • 项目启动以及Vue初识
  • Python整合Milvus向量数据库案例实战
  • 通过HIVE SQL获取每个用户的最大连续登录时常
  • 【Opencv+Yolo】Day2_图像处理
  • Vim 常用命令
  • 《数据结构初阶》【番外篇:快速排序的前世今生】
  • MySQL的主从复制