.NET WebAPI 使用 GroupName 对 Controller 分组呈现 Swagger UI
在日常开发 webapi 时,我们往往会集成 swagger doc 进行 api 的文档呈现,当api数量比较多的时候就会导致 swagger ui 上的 api 因为数量太多而显得杂乱,今天教大家如何利用 GroupName 属性来对 api 的 Controller 进行分组,然后利用 swagger ui 上的 Select a definition 切换功能进行多组 Controller 的切换。
首先进行swagger注册
#region 注册 Swagger
builder.Services.AddTransient<IConfigureOptions<SwaggerGenOptions>, SwaggerConfigureOptions>(); builder.Services.AddSwaggerGen(options =>
{
options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, $"{typeof(Program).Assembly.GetName().Name}.xml"), true); var modelPrefix = Assembly.GetEntryAssembly()?.GetName().Name + ".Models.";
options.SchemaGeneratorOptions = new SchemaGeneratorOptions { SchemaIdSelector = type => type.ToString()[(type.ToString().IndexOf("Models.") + 7)..].Replace(modelPrefix, "").Replace("`1", "").Replace("+", ".") };
});
#endregion
然后启用 swagger
#region 启用 Swagger //启用中间件服务生成Swagger作为JSON端点
app.UseSwagger(); //启用中间件服务对swagger-ui,指定Swagger JSON端点
app.UseSwaggerUI(options =>
{
var apiDescriptionGroups = app.Services.GetRequiredService<IApiDescriptionGroupCollectionProvider>().ApiDescriptionGroups.Items;
foreach (var description in apiDescriptionGroups)
{
options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName);
}
}); #endregion
这里用到了一个自定义的 Swagger Doc 生成配置
public class SwaggerConfigureOptions : IConfigureOptions<SwaggerGenOptions>
{
private readonly IApiDescriptionGroupCollectionProvider provider; public SwaggerConfigureOptions(IApiDescriptionGroupCollectionProvider provider) => this.provider = provider; public void Configure(SwaggerGenOptions options)
{
foreach (var description in provider.ApiDescriptionGroups.Items)
{
options.SwaggerDoc(description.GroupName, null);
}
} }
这个方法的主要作用就是从 ApiDescriptionGroups 进行循环依次添加多个 Swagger Doc
然后关于本文目的的 swagger 配置就完成了。接下来就是对控制器进行分组标记的操作了。
关于对 Controller 进行 GroupName 分组,这里需要用到 ApiExplorerSettings 属性来标记 GroupName,并且同时修改 Route 信息,添加前缀,示例如下
/// <summary>
/// 系统访问授权模块
/// </summary>
[ApiExplorerSettings(GroupName = "Basic")]
[Route("Basic/[controller]")]
[ApiController]
public class AuthorizeController : ControllerBase
{ }
这样就将 AuthorizeController 分到了 Basic 组,在 swagger ui 网页呈现如下
我们可以按照控制器的功能属性或者业务属性,将多个控制器分配到一个 Group。
上面讲的方法需要对所有的控制器进行添加 [ApiExplorerSettings(GroupName = "xxxxx")] 属性,下面顺便介绍一下如何通过文件的归类对 控制器进行批量添加 GroupName
我们可以调整我们的控制器存放为文件夹,将同一个组的控制器放在一个文件夹中,示例如下图
调整存放路径之后,利用 vs 的 同步命名空间功能,选中项目,直接右击 同步命名空间,就可以把所有控制器的命名空间都调整过来,命名空间的最后一节其实就是我们文件夹的名称,也就是我们的 GroupName,如下:
然后我们可以利用 IControllerModelConvention 在项目启动时获取控制器命名空间的最后一节的值,将他赋值到控制器的 [ApiExplorerSettings(GroupName = "xxxxx")] GroupName 属性,代码如下
public class GroupNameConvention : IControllerModelConvention
{
public void Apply(ControllerModel controller)
{
var controllerNamespace = controller.ControllerType.Namespace;
var groupName = controllerNamespace!.Split('.').LastOrDefault();
controller.ApiExplorer.GroupName = groupName;
}
}
然后只要在项目启动时注入这个方法即可
builder.Services.AddMvc(options =>
{
options.Conventions.Add(new GroupNameConvention());
});
这样就完成了对 控制器 GroupName 的批量赋值,不过如果想要保持路由前缀和 GroupName 一致的话,还是需要自己手动的调整一下 控制器的路由前缀。
.NET WebAPI 使用 GroupName 对 Controller 分组呈现 Swagger UI的更多相关文章
- WebApi使用swagger ui自动生成接口文档
之前就写到.最近正在使用webapi.这里介绍一个实用的东西swageer ui现在开发都是前后端分开.我们这里是给前端提供api.有时候对于一个api的描述,并不想专门写一份文档.很浪费时间.swa ...
- webapi+swagger ui 文档描述
代码:GitHub swagger ui在我们的.NET CORE和.NET Framework中的展现形式是不一样的,如果有了解的,在.NET CORE中的是比.NET Framework好的.两张 ...
- C# ABP WebApi与Swagger UI的集成
本文是配置WebApi与Swagger UI,可以参照 http://www.cnblogs.com/farb/p/ABPSwaggerUIIntegration.html 1. 安装swagger ...
- Asp.net WebApi 配置 Swagger UI
首先安装Swashbuckle.Core 然后添加swagger配置文件. [assembly: PreApplicationStartMethod(typeof(SwaggerConfig), &q ...
- Flask 系列之 构建 Swagger UI 风格的 WebAPI
说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验 环境初始化 # 创建项目目录 mkdir helloworl ...
- 【转】C# ABP WebApi与Swagger UI的集成
以前在做WebAPI调用测试时,一直在使用Fiddler测试工具了,而且这个用起来比较繁琐,需要各种配置,并且不直观,还有一点是还得弄明白URL地址和要传递的参数,然后才能调用. 最近新入职,公司里 ...
- Swagger UI in AspNetCore WebAPI
Swagger其实包含了三个部分,分别是Swagger Editor文档接口编辑器,根据接口文档生成code的Swagger Codegen,以及生成在线文档的Swagger UI.在AspNetCo ...
- .Net WebApi接口之Swagger UI 隐藏指定接口类或方法
swagger的一个最大的优点是能实时同步api与文档,但有些时候我们不想全部公开接口,而要隐藏或屏蔽一些接口类或方法,swagger也是支持的,只需要设置一下DocumentFilter方法. 第一 ...
- 在WebAPI中自动创建Controller
在MIS系统中,大部分的操作都是基本的CRUD,并且这样的Controller非常多. 为了复用代码,我们常常写一个泛型的基类. public class EntityController<T& ...
随机推荐
- Unity实现简单的对象池
一.简介 先说说为什么要使用对象池 在Unity游戏运行时,经常需要生成一些物体,例如子弹.敌人等.虽然Unity中有Instantiate()方法可以使用,但是在某些情况下并不高效.特别是对于那些需 ...
- Spring Cloud Feign+Hystrix自定义异常处理
开启Hystrix spring-cloud-dependencies Dalston版本之后,默认Feign对Hystrix的支持默认是关闭的,需要手动开启. feign.hystrix.enabl ...
- RocketMq 完整部署
目录 RocketMq 部署 环境 物理机部署 自定义日志目录 自定义参数和数据存放位置 服务启动 启动name server 启动broker 关停服务 尝试发送消息 常见报错 部署 rockerm ...
- 国产开源优秀新一代MPP数据库StarRocks入门之旅-数仓新利器(上)
概述 背景 Apache Doris官方地址 https://doris.apache.org/ Apache Doris GitHub源码地址 https://github.com/apache/i ...
- 前端js堆栈
1.介绍创建数据的时候就会占用内容.内存主要开辟了两类空间1. 堆(进程,线程共享) 大小不固定,可随时增加不允许js直接访问堆内存存储引用类型数据按引用访问存储的值大小不定,可动态调整主要用来存放对 ...
- 个人冲刺(四阶段)——体温上报app(一阶段)
任务:完成了后台数据库的类模块 MyDBHelper.java package com.example.helloworld; import android.content.Context; impo ...
- Ubuntu 静默安装DEB包(非交互式)~解决Ubuntu下安装DEB包弹窗交互的问题
在Ubuntu环境下安装DEB包时,比如安装MySQL式经常会弹出交互式要输入密码的操作.有时候我们期望编写Shell脚本一键部署MySQL时不想要弹窗交互时,则可以使用以下方式实现自动化安装Deb软 ...
- 安装Suberversion[SVN]到CentOS(YUM)
运行环境 系统版本:CentOS Linux release 7.3.1611 (Core) 软件版本:Suberversion-1.7.14 硬件要求:无 安装过程 1.安装YUM-EPEL源 Su ...
- 如何在 Mac 和虚拟机上安装 macOS Big Sur、Monterey 和 Ventura
请访问原文链接:https://sysin.org/blog/how-to-install-macos/,查看最新版.原创作品,转载请保留出处. 作者主页:www.sysin.org 名词解释: 硬件 ...
- 从零开始实现lmax-Disruptor队列(二)多消费者、消费者组间消费依赖原理解析
MyDisruptor V2版本介绍 在v1版本的MyDisruptor实现单生产者.单消费者功能后.按照计划,v2版本的MyDisruptor需要支持多消费者和允许设置消费者组间的依赖关系. 由于该 ...