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

news2024/10/7 10:20:53

一、前言

现在已经进入了微服务的开发时代了,在这个时代,如果有人问你什么是微服务,你说不知道,就有点太丢人了,别人会有异样的眼光看你,俗话说:唾液淹死人。没办法,我们只能去学习新的东西。一提到微服务,有一个绕不过的话题就是作为微服务的载体,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 当前的项目中

/// <summary>
    /// 该类型定义了 WebAPI 版本的信息。
    /// </summary>
    public static class ApiVersionInfo
    {
        /// <summary>
        /// 初始化默认值。
        /// </summary>
        static ApiVersionInfo()
        {
            V1 = string.Empty;
            V2 = string.Empty;
            V3 = string.Empty;
            V4 = string.Empty;
        }

        /// <summary>
        /// 获取或者设置 V1 版本。
        /// </summary>
        public static string V1;

        /// <summary>
        /// 获取或者设置 V2 版本。
        /// </summary>
        public static string V2;

        /// <summary>
        /// 获取或者设置 V3 版本。
        /// </summary>
        public static string V3;

        /// <summary>
        /// 获取或者设置 V4 版本。
        /// </summary>
        public static string V4;
    }

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

using PatrickLiu.Net6.WebApiDetails.Extensions;
using System.Reflection;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();

#region 自定义配置Swagger

builder.Services.AddSwaggerGen(c =>
{
    foreach (FieldInfo field in typeof(ApiVersionInfo).GetFields())
    {
        c.SwaggerDoc(field.Name, new Microsoft.OpenApi.Models.OpenApiInfo()
        {
            Title = $"{field.Name}:这里是 PatrickLiu 教育",
            Version = field.Name,
            Description = $"当前的 ASP.Net Core Web API {field.Name} 版本"
        });
    }

    #region 增加api读取注释

    //获取应用程序所在目录(绝对不受工作目录影响,建议采用此方法获取路径)
    string? basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);

    if (!string.IsNullOrEmpty(basePath) && !string.IsNullOrWhiteSpace(basePath))
    {
        string xmlPath = Path.Combine(basePath, "PatrickLiu.Net6.WebApiDetails.xml");
        c.IncludeXmlComments(xmlPath);
    }

    #endregion
});

#endregion

#region 日志扩展

//builder.Logging.AddLog4Net("Config/log4net.config");

builder.Services.AddLogging(builder =>
{
    builder.AddLog4Net("Config/log4net.config");
});

#endregion

var app = builder.Build();

#region Swagger 具体的配置

app.UseSwagger();
app.UseSwaggerUI(c =>
{
    foreach (FieldInfo field in typeof(ApiVersionInfo).GetFields())
    {
        c.SwaggerEndpoint($"/swagger/{field.Name}/swagger.json", $"{field.Name}");
    }
});

#endregion

app.UseAuthorization();

app.MapControllers();

app.Run();

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

/// <summary>
    /// 订单的服务控制器。
    /// </summary>
    [Route("api/[controller]/[action]")]
    [ApiController]
    [ApiExplorerSettings(GroupName =nameof(ApiVersionInfo.V1))]
    public class OrdersController : ControllerBase
    {
        /// <summary>
        /// 获取数据列表。
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [Route("GetAll")]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        /// <summary>
        /// 获取主键所对应的数据。
        /// </summary>
        /// <param name="id">查询的主键。</param>
        /// <returns></returns>
        [HttpGet("{id}")]
        public string Get(int id)
        {
            return "value";
        }

        /// <summary>
        /// 增加数据。
        /// </summary>
        /// <param name="value">参数</param>
        [HttpPost]
        public void Post([FromBody] string value)
        {
        }

        /// <summary>
        /// 修改数据。
        /// </summary>
        /// <param name="id">查询主键。</param>
        /// <param name="value">要修改的值。</param>
        [HttpPut("{id}")]
        public void Put(int id, [FromBody] string value)
        {
        }

        /// <summary>
        /// 删除数据。
        /// </summary>
        /// <param name="id">要删除的主键。</param>
        [HttpDelete("{id}")]
        public void Delete(int id)
        {
        }
    }

/// <summary>
    ///
    /// </summary>
    [Route("v2/api/[controller]")]
    [ApiController]
    [ApiExplorerSettings(GroupName = nameof(ApiVersionInfo.V2))]
    public class OrdersV2Controller : ControllerBase
    {
        /// <summary>
        /// 获取数据列表。
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        /// <summary>
        /// 获取主键所对应的数据。
        /// </summary>
        /// <param name="id">查询的主键。</param>
        /// <returns></returns>
        [HttpGet("{id}")]
        public string Get(int id)
        {
            return "value";
        }

        /// <summary>
        /// 增加数据。
        /// </summary>
        /// <param name="value">参数</param>
        [HttpPost]
        public void Post([FromBody] string value)
        {
        }

        /// <summary>
        /// 修改数据。
        /// </summary>
        /// <param name="id">查询主键。</param>
        /// <param name="value">要修改的值。</param>
        [HttpPut("{id}")]
        public void Put(int id, [FromBody] string value)
        {
        }

        /// <summary>
        /// 删除数据。
        /// </summary>
        /// <param name="id">要删除的主键。</param>
        [HttpDelete("{id}")]
        public void Delete(int id)
        {
        }

        /// <summary>
        /// 增加一个人。
        /// </summary>
        /// <param name="person">要增加的人</param>
        /// <param name="id">主键值。</param>
        /// <param name="name">姓名。</param>
        /// <param name="sex">性别</param>
        /// <param name="address">地址。</param>
        [HttpPost]
        [Route("PutData")]
        public void PutData(SinglePerson person,int id,string name,bool sex,string address)
        {

        }
    }

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

三、结束语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/365965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一款 Linux、数据库、Redis、MongoDB 统一管理平台,这个开源平台非常好用!

一、开源项目简介基于DDD分层实现的web版 linux(终端 文件 脚本 进程)、数据库&#xff08;mysql postgres&#xff09;、redis(单机 集群)、mongo统一管理操作平台二、开源协议使用Apache-2.0开源协议三、界面展示&#xff08;系统核心功能截图&#xff09;四、服务部署&#…

Windows 平台 oracle11g 单机 打补丁(33883353)

一、从oracle官网下载最新补丁包和打包工具 二、 对数据库及软件作全备 略 三、解压p33883353_112040_MSWIN-x86-64.zip 在33883353文件夹中打开README.html 2.1 OPatch Utility You must use the OPatch utility version 11.2.0.3.34 or later to apply this patch. 必须…

Maven 依赖-镜像仓库替换为 -- 阿里云镜像仓库(飞快实现 pom 引入)

在本地 maven 的 setting 配置文件中加上阿里云镜像地址就行了&#xff1a;新增配置内容&#xff1a;<!-- 阿里镜像仓库 --><mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus…

高项--十大管理、47个过程、五大过程组

十大管理、47个过程、五大过程组【联想记忆】 文章目录 十大管理、47个过程、五大过程组【联想记忆】 十大管理 1.十大管理是哪几个&#xff1f; 2.十大管理记忆口诀&#xff1a; 3.各大管理记忆口诀&#xff1a; 4.十大管理、十大管理的47个过程、47个过程所属的五大过程组&a…

一篇文章搞定linux网络模型

网络协议感觉晦涩难懂&#xff1f;什么七层网络模型&#xff1f;又五层网络模型&#xff1f;又四层网络模型&#xff1f;TCP/IP协议是个啥&#xff1f;UDP是啥&#xff1f;什么是三次握手&#xff1f;什么是四次挥手&#xff1f;tcpdump听说是抓包的&#xff0c;怎么用&#xf…

期末综合考试

一、概率论1、全概率公式、贝叶斯公式应用2、期望、方差、协方差的定义以及性质证明(1) 期望(2) 方差(3) 协方差二、数理统计1、参数估计(1) 矩估计(2) 最大似然估计(3) 综合例题一、概率论 1、全概率公式、贝叶斯公式应用 记住标黄的两段&#xff0c;上考场直接套数据&#x…

相交链表【2.23】

题目&#xff1a;给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;…

SYSU程设c++(第一周) io流、命名空间、引用

理论题&#xff1a; 1.std::cout<<0a; 的输出是97 &#xff08;0转换了类型成int&#xff0c;‘a变成askll码&#xff09; 2.std::cout<<0"12.34";的输出是12.34 &#xff08;0无用&#xff0c;忽略) 3.std::cout<<1"12.34";则编译错…

批量修改word中的表格属性

背景&#xff1a;写接口文档&#xff0c;程序导出的接口文档格式不符合标书的需要&#xff0c;要批量设置word表格及文本————————————————————————————————方法&#xff1a;我们可以通过word的宏观能&#xff0c;实现批量设置。1说明&#xff…

表格内容过多时单行/多行显示

分析 单行多行显示涉及到 table-layout: fixed; 这个属性&#xff0c;默认状态下的属性值是 auto &#xff08;自动表格布局&#xff09;&#xff0c;两种不同的属性值区别如下&#xff1a; 方法 我在设置表格内容单行/多行显示时采用的方法&#xff1a; table 添加的样式&a…

JS - 原型对象、原型链是什么

一 阅读掘金 https://juejin.cn/post/7007416743215759373 https://juejin.cn/post/7007416743215759373 二 阅读掘金小册原型知识点 原型 涉及面试题&#xff1a;如何理解原型&#xff1f;如何理解原型链&#xff1f; 当我们创建一个对象时 let obj { age: 25 }&#xff0…

设备太分散?如何一站式管理边缘 OS、K8s 和应用?

作者简介 张志龙&#xff0c;SUSE 大中华区资深解决方案架构师&#xff0c;CNCF 官方认证的 CKA&CKAD 工程师&#xff0c;深耕以 Kubernetes 为代表的云原生领域&#xff0c;具备丰富的架构设计、业务容器化改造和项目落地实践经验。 据 Gartner 预测&#xff0c;到 2025 年…

【GlobalMapper精品教程】053:打开dbf文件并生成有坐标系的shp数据

本文讲解在globalmapper汇总打开dbf文件并生成有坐标系的shp数据。 文章目录一、dbf文件解读二、打开dbf文件二、另存为shp文件一、dbf文件解读 我们可以通过Excel或FME等多种软件查看dbf的结构&#xff0c;字段有&#xff1a;Name&#xff0c;kind&#xff0c;Lat&#xff0c…

事理知识图谱

事理知识图谱能够有力第建模各类事件之间的演化关联关系为事理逻辑推理提供更好的数据基础。 事理图谱定义 事理知识图谱可以将文本中对事件以及事件之间的关系抽取并抽象出来&#xff0c;构建成一个有向图形式的事理知识库。在结构上&#xff0c;事理知识图谱是一个有向有环…

SparkSQL

第1章 SparkSQL 概述1.1 SparkSQL 是什么Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。1.2 Hive and SparkSQLSparkSQL 的前身是 Shark&#xff0c;给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供快速上手的工具。Hive 是早期唯一运行在 Hadoop …

vue项目中引入字体包

问题&#xff1a; 项目开发过程中&#xff0c;因UI的显示要求&#xff0c;需要引入一些字体&#xff0c;那如何引入外部字体呢&#xff1f;很简单&#xff0c;只需要以下3步 一 下载对应的字体包文件&#xff0c;放置到我们的项目中 ​ 比如我需要PingFangSC的系列字体&#…

交叉编译 cJSON

交叉编译 cJSON 概述 JSON 是一种轻量级数据交换格式。它可以表示数据、字符串、有序的值序列以及名称/值对的集合。 cJSON 是 ANSI C 中超轻量级的 JSON 解析器。cJSON 旨在成为您可以完成任务的最简单的解析器。它是一个 C 文件和一个头文件。作为一个库&#xff0c;cJSON…

VR全景+汽车,打造汽车销售新模式

在国内汽车市场竞争越来越激烈的背景下&#xff0c;传统汽车、混动汽车、新能源汽车等各类汽车市场正在不断壮大&#xff0c;汽车行业企业必须抓住机遇、迎接挑战&#xff0c;而营销引流则是关键步骤之一。未来&#xff0c;汽车行业的营销方式将更加高效数字化&#xff0c;采用…

Python学习-----lambda式匿名函数

目录 前言&#xff1a; 1.什么是lambda函数 2.使用示例 &#xff08;1&#xff09;示例1&#xff1a;与def对比 &#xff08;2&#xff09;示例2&#xff1a;与三目运算符 &#xff08;3&#xff09;示例3&#xff1a;lambda作为参数传入其他函数 &#xff08;4&#xff…

linux环境中编译exosip2和osip2库

1 前言 在开发GB/T 28181信令服务或网关时&#xff0c;要使用SIP协议栈。其中一种熟悉的开源库就是exosiposip了。在windows环境中编译eXosip2和osip2比较简便&#xff1b;在linux中&#xff0c;默认方式下编译这2个库&#xff0c;也比较方便。如果要指定库的安装目录&#xf…