• 如何在Net6.0里配置多版本支持并支持注释说明的Swagger


    一、前言
        现在已经进入了微服务的开发时代了,在这个时代,如果有人问你什么是微服务,你说不知道,就有点太丢人了,别人会有异样的眼光看你,俗话说:唾液淹死人。没办法,我们只能去学习新的东西。一提到微服务,有一个绕不过的话题就是作为微服务的载体,WebAPI是离不开的。但是我们今天不讲WebAPI是什么,如何开发API,以及如何开发Restfull风格的API,我们聊另外一个话题,如何配置Swagger,让其支持多版本,并且支持参数、方法的注释说明。
        为什么我们会说这呢,因为,我们要开发API,就会涉及到别人如何使用你的API,相应的使用文档就少不了,当时当我们有了Swagger,就不一样了。Swagger会为我们提供这个文档的功能。
        我们今天开发的环境是:
                操作系统:Windows 10 Professional
                开发工具:Visual Studio 2022
                开发语言:C#
                开发平台:Asp.Net Core Web API 6.0。
                平台类型:跨平台。

    二、我们开始配置Swagger,让其支持多版本和注释。
        在我们开始配置之前,先有一个直观的感受,我直接上一个截图。
        先来第一张截图,概况展示:
          

            再来一张,接口内部详情的:
          


        1、我们先设置一个版本信息的工具类,这个工具类可以放在单独的类库项目中,也可以放在 WebAPI 当前的项目中。        

    复制代码
     1 /// 
     2     /// 该类型定义了 WebAPI 版本的信息。
     3     /// 
     4     public static class ApiVersionInfo
     5     {
     6         /// 
     7         /// 初始化默认值。
     8         /// 
     9         static ApiVersionInfo()
    10         {
    11             V1 = string.Empty;
    12             V2 = string.Empty;
    13             V3 = string.Empty;
    14             V4 = string.Empty;
    15         }
    16 
    17         /// 
    18         /// 获取或者设置 V1 版本。
    19         /// 
    20         public static string V1;
    21 
    22         /// 
    23         /// 获取或者设置 V2 版本。
    24         /// 
    25         public static string V2;
    26 
    27         /// 
    28         /// 获取或者设置 V3 版本。
    29         /// 
    30         public static string V3;
    31 
    32         /// 
    33         /// 获取或者设置 V4 版本。
    34         /// 
    35         public static string V4;
    36     }
    复制代码


        2、我们在 Program 里面配置 Swagger ,具体分为两个部分。

    复制代码
     1 using PatrickLiu.Net6.WebApiDetails.Extensions;
     2 using System.Reflection;
     3 
     4 var builder = WebApplication.CreateBuilder(args);
     5 
     6 // Add services to the container.
     7 
     8 builder.Services.AddControllers();
     9 // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    10 builder.Services.AddEndpointsApiExplorer();
    11 
    12 #region 自定义配置Swagger
    13 
    14 builder.Services.AddSwaggerGen(c =>
    15 {
    16     foreach (FieldInfo field in typeof(ApiVersionInfo).GetFields())
    17     {
    18         c.SwaggerDoc(field.Name, new Microsoft.OpenApi.Models.OpenApiInfo()
    19         {
    20             Title = $"{field.Name}:这里是 PatrickLiu 教育",
    21             Version = field.Name,
    22             Description = $"当前的 ASP.Net Core Web API {field.Name} 版本"
    23         });
    24     }
    25 
    26     #region 增加api读取注释
    27 
    28     //获取应用程序所在目录(绝对不受工作目录影响,建议采用此方法获取路径)
    29     string? basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
    30 
    31     if (!string.IsNullOrEmpty(basePath) && !string.IsNullOrWhiteSpace(basePath))
    32     {
    33         string xmlPath = Path.Combine(basePath, "PatrickLiu.Net6.WebApiDetails.xml");
    34         c.IncludeXmlComments(xmlPath);
    35     }
    36 
    37     #endregion
    38 });
    39 
    40 #endregion
    41 
    42 #region 日志扩展
    43 
    44 //builder.Logging.AddLog4Net("Config/log4net.config");
    45 
    46 builder.Services.AddLogging(builder =>
    47 {
    48     builder.AddLog4Net("Config/log4net.config");
    49 });
    50 
    51 #endregion
    52 
    53 var app = builder.Build();
    54 
    55 #region Swagger 具体的配置
    56 
    57 app.UseSwagger();
    58 app.UseSwaggerUI(c =>
    59 {
    60     foreach (FieldInfo field in typeof(ApiVersionInfo).GetFields())
    61     {
    62         c.SwaggerEndpoint($"/swagger/{field.Name}/swagger.json", $"{field.Name}");
    63     }
    64 });
    65 
    66 #endregion
    67 
    68 app.UseAuthorization();
    69 
    70 app.MapControllers();
    71 
    72 app.Run();
    复制代码


        3、我们建立我们自己的 APIController ,为每个 Controller 增加 [ApiExplorerSettings(GroupName = nameof(ApiVersionInfo.版本号)) ],我就创建了2个Controller。

    复制代码
    /// 
        /// 订单的服务控制器。
        /// 
        [Route("api/[controller]/[action]")]
        [ApiController]
        [ApiExplorerSettings(GroupName =nameof(ApiVersionInfo.V1))]
        public class OrdersController : ControllerBase
        {
            /// 
            /// 获取数据列表。
            /// 
            /// 
            [HttpGet]
            [Route("GetAll")]
            public IEnumerable<string> Get()
            {
                return new string[] { "value1", "value2" };
            }
    
            /// 
            /// 获取主键所对应的数据。
            /// 
            /// 查询的主键。
            /// 
            [HttpGet("{id}")]
            public string Get(int id)
            {
                return "value";
            }
    
            /// 
            /// 增加数据。
            /// 
            /// 参数
            [HttpPost]
            public void Post([FromBody] string value)
            {
            }
    
            /// 
            /// 修改数据。
            /// 
            /// 查询主键。
            /// 要修改的值。
            [HttpPut("{id}")]
            public void Put(int id, [FromBody] string value)
            {
            }
    
            /// 
            /// 删除数据。
            /// 
            /// 要删除的主键。
            [HttpDelete("{id}")]
            public void Delete(int id)
            {
            }
        }
    复制代码
    复制代码
     1 /// 
     2     /// 
     3     /// 
     4     [Route("v2/api/[controller]")]
     5     [ApiController]
     6     [ApiExplorerSettings(GroupName = nameof(ApiVersionInfo.V2))]
     7     public class OrdersV2Controller : ControllerBase
     8     {
     9         /// 
    10         /// 获取数据列表。
    11         /// 
    12         /// 
    13         [HttpGet]
    14         public IEnumerable<string> Get()
    15         {
    16             return new string[] { "value1", "value2" };
    17         }
    18 
    19         /// 
    20         /// 获取主键所对应的数据。
    21         /// 
    22         /// 查询的主键。
    23         /// 
    24         [HttpGet("{id}")]
    25         public string Get(int id)
    26         {
    27             return "value";
    28         }
    29 
    30         /// 
    31         /// 增加数据。
    32         /// 
    33         /// 参数
    34         [HttpPost]
    35         public void Post([FromBody] string value)
    36         {
    37         }
    38 
    39         /// 
    40         /// 修改数据。
    41         /// 
    42         /// 查询主键。
    43         /// 要修改的值。
    44         [HttpPut("{id}")]
    45         public void Put(int id, [FromBody] string value)
    46         {
    47         }
    48 
    49         /// 
    50         /// 删除数据。
    51         /// 
    52         /// 要删除的主键。
    53         [HttpDelete("{id}")]
    54         public void Delete(int id)
    55         {
    56         }
    57 
    58         /// 
    59         /// 增加一个人。
    60         /// 
    61         /// 要增加的人
    62         /// 主键值。
    63         /// 姓名。
    64         /// 性别
    65         /// 地址。
    66         [HttpPost]
    67         [Route("PutData")]
    68         public void PutData(SinglePerson person,int id,string name,bool sex,string address)
    69         { 
    70         
    71         }
    72     }
    复制代码


        4、运行起来,看看效果吧。

          

     


    三、结束语
        当我们的WebAPI有了新版本,我们也不用怕了,只要按我的设置,就可以灵活应付。不负苍天,继续努力。

  • 相关阅读:
    Transformer Block运算量
    FOFAHUB使用测试
    【vue】如何安装vue 脚手架以及创建脚手架项目_10
    /usr/bin/curl: Argument list too long
    Linux驱动移植USB网卡r8156驱动(详细)总结
    Clickhouse的SQL查询监控机制调研
    刚体动力学-牛顿欧拉方程(刚体旋转)
    【Rust指南】组织管理|路径表示|访问权限
    合宙Air724UG LuatOS-Air LVGL API控件-二维码(Qrcode)
    数据可视化:视觉感知与基本图表
  • 原文地址:https://www.cnblogs.com/PatrickLiu/p/17147638.html