新闻详情

新闻详情

首页 / 资讯中心 / 详情

rust actix-web swagger如何编写

发布时间:2026/9/28 21:26:45来源:尧图网络
rust actix-web swagger如何编写
# Rust Actix-Web 集成 Swagger (OpenAPI)在 Rust Actix-Web 生态中,最常用的方案是 **utoipa** **utoipa-swagger-ui**(utoipa v5.x 之后,actix-web 集成从 utoipa-swagger-ui 独立到 utoipa-actix-web)。## 一、依赖配置### 方案 A:utoipa v4.x(推荐入门,生态稳定)toml[dependencies]actix-web 4serde { version 1, features [derive] }serde_json 1utoipa { version 4, features [actix_extras] }utoipa-swagger-ui { version 6, features [actix-web] }### 方案 B:utoipa v5.x(较新)toml[dependencies]actix-web 4serde { version 1, features [derive] }utoipa { version 5, features [actix_extras] }utoipa-actix-web 0.1utoipa-swagger-ui { version 8, features [actix-web] }下面以 **v4 方案** 为例,兼容性最好。---## 二、完整示例代码rustuse actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};use serde::{Deserialize, Serialize};use utoipa::{OpenApi, ToSchema};use utoipa_swagger_ui::SwaggerUi;// 数据模型 #[derive(Serialize, Deserialize, ToSchema)]struct User {id: i64,name: String,email: String,}#[derive(Serialize, Deserialize, ToSchema)]struct CreateUser {name: String,email: String,}#[derive(Serialize, ToSchema)]struct ErrorResponse {code: i32,message: String,}// 请求处理器 /// 获取用户列表#[utoipa::path(get,path /users,tag user,responses((status 200, description 查询成功, body VecUser),))]#[get(/users)]async fn list_users() - impl Responder {let users vec![User { id: 1, name: Alice.into(), email: aliceexample.com.into() },User { id: 2, name: Bob.into(), email: bobexample.com.into() },];HttpResponse::Ok().json(users)}/// 根据 ID 获取用户#[utoipa::path(get,path /users/{id},tag user,params((id i64, Path, description 用户 ID)),responses((status 200, description 查询成功, body User),(status 404, description 用户不存在, body ErrorResponse),))]#[get(/users/{id})]async fn get_user(path: web::Pathi64) - impl Responder {let id path.into_inner();if id 1 {HttpResponse::Ok().json(User {id,name: Alice.into(),email: aliceexample.com.into(),})} else {HttpResponse::NotFound().json(ErrorResponse {code: 404,message: not found.into(),})}}/// 创建用户#[utoipa::path(post,path /users,tag user,request_body CreateUser,responses((status 200, description 创建成功, body User),(status 400, description 参数错误, body ErrorResponse),))]#[post(/users)]async fn create_user(body: web::JsonCreateUser) - impl Responder {let user User {id: 100,name: body.name.clone(),email: body.email.clone(),};HttpResponse::Ok().json(user)}// OpenApi 文档定义 #[derive(OpenApi)]#[openapi(paths(list_users, get_user, create_user),components(schemas(User, CreateUser, ErrorResponse)),tags((name user, description 用户管理 API)),info(title Demo API,version 1.0.0,description Actix-Web Utoipa 示例))]struct ApiDoc;// main #[actix_web::main]async fn main() - std::io::Result() {println!(Swagger UI: http://127.0.0.1:8080/swagger-ui/);HttpServer::new(|| {App::new().service(SwaggerUi::new(/swagger-ui/{_:.*}).url(/api-docs/openapi.json, ApiDoc::openapi()),).service(list_users).service(get_user).service(create_user)}).bind((127.0.0.1, 8080))?.run().await}运行后访问:- Swagger UI: http://127.0.0.1:8080/swagger-ui/- OpenAPI JSON: http://127.0.0.1:8080/api-docs/openapi.json---## 三、关键点详解### 1. #[utoipa::path] 宏标注在 handler 函数上,描述该接口:| 参数 | 说明 ||------|------|| get/post/put/delete | HTTP 方法 || path /xxx | 路由路径,**必须与 #[get(...)] 一致** || tag | 分组标签,便于 UI 分类 || params(...) | 路径/查询/Header 参数 || request_body T | 请求体类型 || responses(...) | 响应定义 |### 2. 参数写法rustparams(// 路径参数(id i64, Path, description 用户 ID),// 查询参数(page Optionu32, Query, description 页码),// Header(X-Token String, Header, description 认证 Token),)### 3. 响应体与状态码rustresponses((status 200, description OK, body User),(status 400, description Bad Request, body ErrorResponse),(status 401, description Unauthorized),)### 4. 数据模型所有作为 body 的 struct 都要 derive ToSchema:rust#[derive(Serialize, Deserialize, ToSchema)]struct Foo { ... }需要额外示例时可以加 #[schema(example ...)]:rust#[derive(ToSchema)]struct User {#[schema(example 1)]id: i64,#[schema(example alice)]name: String,}### 5. 分组多个模块(常用)当接口很多时,把 OpenApi 拆成多个:rust#[derive(OpenApi)]#[openapi(paths(list_users, get_user), tags((name user)))]struct UserApi;#[derive(OpenApi)]#[openapi(paths(list_orders, create_order), tags((name order)))]struct OrderApi;#[derive(OpenApi)]#[openapi(nest((path /api, api UserApi),(path /api, api OrderApi),),components(schemas(User, Order)))]struct ApiDoc;### 6. 路由嵌套 (web::scope)rustHttpServer::new(|| {App::new().service(SwaggerUi::new(/swagger-ui/{_:.*}).url(/api-docs/openapi.json, ApiDoc::openapi()),).service(web::scope(/api).service(list_users).service(get_user))})注意:path /users 里写**完整路径**(/api/users)。---## 四、常见坑1. **path 必须和注解路由一致** — 否则 Swagger UI 上显示的路径不可用。2. **Body struct 必须 derive ToSchema 且 Serialize/Deserialize**,否则无法序列化示例。3. **泛型/嵌套类型** 需要用 #[schema(value_type ...)] 手动指定。4. **v5 版本** utoipa-actix-web 独立后,SwaggerUi 初始化方式有变化,注意版本对应。5. **{id} 路径参数** 用 Path,不要用 Query。---## 五、v5 的写法差异(简要)rustuse utoipa_actix_web::{AppExt, scope};use utoipa_swagger_ui::SwaggerUi;HttpServer::new(|| {App::new().into_utoipa_app().openapi(ApiDoc::openapi()).service(list_users).openapi_service(|api| {SwaggerUi::new(/swagger-ui/{_:.*}).url(/api-docs/openapi.json, api)}).into_app()})---**总结**:核心是三个东西 —— ToSchema(数据模型)、#[utoipa::path](接口描述)、#[derive(OpenApi)](聚合文档),再用 SwaggerUi service 挂载即可。上手成本很低,是 Actix-Web 生态里最成熟的 OpenAPI 方案。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

真实废弃物分类数据集实战:4,800张图从训练到部署 2026/9/28 22:22:11

真实废弃物分类数据集实战:4,800张图从训练到部署

简介:本资源为面向计算机视觉初学者与图像分类实践者的真实废弃物图像分类数据集,覆盖纸板、食品有机物、玻璃、金属、杂项垃圾、纸张、塑料、纺织品垃圾和植被共9个类别,适合用于分类网络训练、迁移学习验证及垃圾分类相关课程设计。数据已完…

阅读更多 →
Altium Designer晶振铺铜挖空设计原理与实操 2026/9/28 22:21:49

Altium Designer晶振铺铜挖空设计原理与实操

1. 这不是“填铜”而是“控铜”:晶振区域铺铜的本质矛盾与破局逻辑Altium Designer里画多边形铺铜,很多人以为只是把空白区域“填满”——这恰恰是导致晶振电路失效、EMI超标、起振失败的根源。我带过三届硬件新人,90%的人第一次做STM32H743Z…

阅读更多 →
Superpowers 实战:为 AI 编程助手注入技能包与四阶段工作流 2026/9/28 22:21:42

Superpowers 实战:为 AI 编程助手注入技能包与四阶段工作流

做开发这么多年,我越来越相信一件事:工具本身不产生价值,用工具的习惯才产生价值。superpowers 这个名字听起来像游戏外挂,实际上是一套围绕 AI 编程助手设计的技能增强方案。它不是要替代 Codex 这类智能体,而是给它们…

阅读更多 →
Superpowers技能包:让AI编程Agent输出质量更稳的实战指南 2026/9/28 22:21:35

Superpowers技能包:让AI编程Agent输出质量更稳的实战指南

superpowers 这个名字第一次看到时,我以为是某个效率玄学工具,直到在 Codex 工作流里真正连续用了一周,才确认它并不是包装出来的概念,而是真的能把 AI 编程 Agent 的产出质量往前推一截的东西。它不是脚手架,也不是&q…

阅读更多 →
基于PaddleOCR的车牌识别算法:从检测到识别的全流程实战与优化 2026/9/28 22:21:08

基于PaddleOCR的车牌识别算法:从检测到识别的全流程实战与优化

简介:本资源面向计算机视觉初学者与进阶开发者,提供一套基于PaddleOCR的车牌识别完整项目源码,帮助读者从零搭建可运行的车牌检测与识别系统,解决车牌定位、字符识别及模型部署等实际问题。压缩包共416个文件,约37MB&a…

阅读更多 →
Python深度学习人脸识别系统毕业设计:从CNN选型到答辩演示全链路 2026/9/28 22:21:08

Python深度学习人脸识别系统毕业设计:从CNN选型到答辩演示全链路

简介:这份资源面向高校学生与深度学习入门者,提供一套基于Python的人脸识别系统完整毕业设计实现,涵盖代码、模型与文档说明,可用于毕业设计、课程设计或期末大作业。项目采用深度学习方案,涉及FER2013、CK、JAFFE等公…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉