6.swagger完善:界面显示注释+多版本控制

swagger,完善,界面显示,注释,版本控制 · 浏览次数 : 432

小编点评

## Generate Swagger Documentation for a Multi-Version API This article addresses two functionalities: adding Swagger documentation for a multi-version API and generating API documentation with comments and switch functionality. **Adding Swagger Documentation with Multiple Versions:** 1. **Create a SwaggerGen Configuration:** - Define an `SwaggerVersion` enum with the supported versions. - Use `s.SwaggerDoc` to configure each API version, specifying its version and description. - Include XML comments in the `xmlPath` parameter, pointing to the generated `FastEasy.Readme.xml` file. 2. **Configure Swagger UI:** - Use `app.UseSwagger` to register the SwaggerGen middleware. - Use `app.UseSwaggerUI` to configure the Swagger UI, specifying the endpoint path and version for each Swagger version. **Multi-Version Switch Functionality:** 1. Define a `SwaggerVersion` enum with the supported versions. 2. Add the following code inside a middleware pipeline: ```csharp app.UseSwagger(); app.UseSwaggerUI(s => { foreach (var version in typeof(SwaggerVersion).GetEnumNames().ToList()) { s.SwaggerEndpoint($"/{version.ToString()}/swagger.json", version.ToString()); s.RoutePrefix = string.Empty; } }); ``` **Other Relevant Code:** 1. Define a custom `SwaagerRouteAttribute` that implements the `IApiDescriptionGroupNameProvider` interface. 2. Use the `SwaagerRouteAttribute` in each controller method or controller action to specify the API version. **Benefits of Using Multiple Versions:** - Improved readability and navigation of the API documentation. - Easier identification of corresponding API resources based on version. - Reduced cognitive load for developers and users. **Note:** This is a high-level overview of the implementation. Specific details might vary based on your project's requirements.

正文

周末,写点简单的水一下。

新版本的vs创建项目的时候可以选择自带一个swagger。然而这只是基本的swagger功能。

 几个接口无所谓啦,随着接口越来越多,就这么丢给你,一时间也会懵逼,所以这篇文章要做的有两个功能。

  1. 给swagger文档添加注释
  2. 给swagger添加切换“版本”的功能(也可以理解为:让不同功能模块的接口显示在一个页面,不然几十上百的接口放一起找也不好找呀~)

右键项目>属性>生成>输出>XML文档文件路径,添加输出的路径,我一般会设置在程序集下的根路径,例如这样:

文件命名什么的随意,一般跟项目有关例如:FastEasy.Readme.xml。

然后去swagger相关的Module模块中去添加一些配置。我这个文章相关的项目一开始的时候就将这些注入配置单独搞成独立的一个模块,所以你只是看到这个文章,那默认就在Programs里面找AddSwaggerGen就好。

        Services.AddSwaggerGen(s =>
        {
            //多版本
            typeof(SwaggerVersion).GetEnumNames().ToList().ForEach(v =>
            {
                s.SwaggerDoc(v, new Microsoft.OpenApi.Models.OpenApiInfo
                {
                    Version = v,
                    Description = $"{v} API",
                    Title = v,
                });
                //添加注释
                var basePath=AppDomain.CurrentDomain.BaseDirectory;
                var xmlPath = Path.Combine(basePath, "FastEasy.Readme.xml");
                s.IncludeXmlComments(xmlPath,true);
            });
        });

 

 

 如果不需要切换版本,那就关注添加注释下面三行代码就好,获取注释文档的路径,然后添加到swagger中。

接下来就是多版本切换,上面的代码已经是了,需要在意的地方是typeof里的SwaggerVersion。这是创建的一个枚举,然后在枚举中按需添加不同的版本切换,例如

        public enum SwaggerVersion
        {
            FastEasy = 1,
            OpenAPI = 2
        }

 

如果要使用多版本,中间件管道里也要改一下

        app.UseSwagger();
        app.UseSwaggerUI(s =>
        {
            typeof(SwaggerVersion).GetEnumNames().ToList().ForEach(v =>
            {
                s.SwaggerEndpoint($"swagger/{v}/swagger.json", $"{v}");
                s.RoutePrefix = string.Empty;
            });
        });

 

到这里就已经完成90%了。最后一步就是给不同的方法或者控制器添加[ApiExplorerSettings(GroupName = "OpenAPI")]

        [HttpGet("MUL")]
        [ApiExplorerSettings(GroupName = "OpenAPI")]
        public int MUL(int i, int j)
        {
            return test.MUL(i, j);
        }

 

原本是加减乘除4个接口,现在就是FastEasy下两个,OpenAPI下两个(只是测试,跟名称毫无关系)

 现在完成了99%了。如果像我这种小公司,没有版本的区别,无非就是为了看着方便,因为功能模块去区分开来。就像现在,查看文档的时候可以根据分类找到相对应的接口,不至于一眼乱糟糟的。

但是实际上并未完成版本控制,因为你会发现,他们的请求路径是差不多的。如果要完成真正的版本控制,有两种方法,第一种简单,路由上写死了:/v1/xxxx   /v2/xxxxx……

第二种就是自定义路由特性:添加一个特性配置的类:SwaagerRouteAttribute。我直接贴代码了,很简单的几行,代码的注释足以解释清楚了

    public class SwaagerRouteAttribute : RouteAttribute, IApiDescriptionGroupNameProvider
    {
        /// <summary>
        /// 默认的路由配置
        /// </summary>
        /// <param name="actionName"></param>
        public SwaagerRouteAttribute(string actionName) : base(actionName)
        {
        }

        /// <summary>
        /// 分组名称,控制不同版本:等同于配置ApiExplorerSettings(GroupName ="FastEasy")
        /// </summary>
        public string? GroupName { get; set; }

        /// <summary>
        /// 自定义的路由配置
        /// </summary>
        /// <param name="version"></param>
        /// <param name="actionName"></param>
        public SwaagerRouteAttribute(SwaggerVersion version, string actionName = "[action]") : base($"/{version.ToString()}/[controller]/{actionName}")
        {
            GroupName = version.ToString();
        }
    }

 

现在!用自己封装的路由属性添加到方法上面(截图看的全)


 

此时才算完成真的版本控制效果:

 啊掰掰~

 

与6.swagger完善:界面显示注释+多版本控制相似的内容:

6.swagger完善:界面显示注释+多版本控制

周末,写点简单的水一下。 新版本的vs创建项目的时候可以选择自带一个swagger。然而这只是基本的swagger功能。 几个接口无所谓啦,随着接口越来越多,就这么丢给你,一时间也会懵逼,所以这篇文章要做的有两个功能。 给swagger文档添加注释 给swagger添加切换“版本”的功能(也可以理解

阅读翻译Mathematics for Machine Learning之2.7 Linear Mappings

阅读翻译Mathematics for Machine Learning之2.7 Linear Mappings 关于: 首次发表日期:2024-07-23 Mathematics for Machine Learning官方链接: https://mml-book.com ChatGPT和KIMI

前端使用 Konva 实现可视化设计器(18)- 素材嵌套 - 加载阶段

本章主要实现素材的嵌套(加载阶段)这意味着可以拖入画布的对象,不只是图片素材,还可以是嵌套的图片和图形。

Langchain 与 LlamaIndex:LLM 应用开发框架的比较与使用建议

Langchain 和 Llamaindex 是两种广泛使用的主流 LLM 应用开发框架。两者有什么不同?我们该如何使用?以下我根据各类资料和相关文档做了初步选型。 一、Langchain 1. 适用场景 (1)需要构建灵活、可扩展的通用应用程序。 (2)需要复杂的工作流程支持。 (3)需要复杂的交

全网最适合入门的面向对象编程教程:20 类和对象的 Python 实现-组合关系的实现与 CSV 文件保存

本文主要介绍了在使用Python面向对象编程时,如何实现组合关系,同时对比了组合关系和继承关系的优缺点,并讲解了如何通过csv模块来保存Python接收/生成的数据。

全网最适合入门的面向对象编程教程:18 类和对象的 Python 实现-多重继承与 PyQtGraph 串口数据绘制曲线图

本文主要介绍了Python中创建自定义类时如何使用多重继承、菱形继承的概念和易错点,同时讲解了如何使用PyQtGraph库对串口接收的数据进行绘图。

Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验

title: Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验 date: 2024/7/16 updated: 2024/7/16 author: [ cmdragon ](https://cmdragon.cn) excerpt: 摘要:“Nuxt.js头部魔法:轻松自定义页面元信息,

全网最适合入门的面向对象编程教程:17 类和对象的Python实现-鸭子类型与“file-like object“

本文主要介绍了Python中创建自定义类时鸭子类型的基本定义、特点和应用场景,同时列举了“file-like object“的例子对鸭子类型进行了说明。

Serverless无服务应用架构纵横谈2:边缘计算激战正酣

Serverless无服务应用架构纵横谈2 前言 6年前,我写了一篇《Serverless无服务应用架构纵横谈》。 文中说到无论是公有云FaaS还是私有云FaaS,都不是云计算的未来。 因为无论是Kubernetes还是PHP、Python、Node这些传统技术栈都太重了。 那么,6年来,Serve

算法金 | 来了,pandas 2.0

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 今日 210+/10000,内含 Pandas 是一个强大的数据分析库,广泛应用于科学研究、金融分析、商业智能等领域。它提供了高效的数据结构和数据分析工具,使得处理和分析数据变得更加简单