Asp.Net Core Swagger 接口分组(支持接口一对多暴露)
2021-01-07 11:29
标签:width def title 判断 services false 核心 包含 count() 开始之前,先介绍下swagger常用方法。 services.AddSwaggerGen //添加swagger中间件 c.SwaggerDoc //配置swagger文档,也就是右上角的下拉框内容 c.IncludeXmlComments //引用程序集xml,用于加载出 备注信息等如图 c.AddSecurityDefinition //添加授权验证 c.DocInclusionPredicate //核心方法,指定分组被加载时 回调进入,也就是swagger右上角下拉框内的分组加载时 每一个分组加载时都会遍历所有控制器的action 进入一次这个方法体内,返回true则 暴露 否则隐藏 多分组步骤: 1.定义自定义标签 2.将标签放在需要 分组的控制器或方法上 3.利用枚举反射加载出每个分组的Doc 4.DocInclusionPredicate 内写核心逻辑代码,利用反射的类进行判断标签值 如需要全部接口暴露并不用打标签的,用SwaggerDoc单独加载一个Doc用于显示全部接口,在DocInclusionPredicate内加入 判断 如果docName等于全部接口的DocName那么直接return true即可,可灵活运行,可配置在json 也可配置在数据库等地方。用于指定分组是否暴露。以上加载Doc时, SwaggerEnumNames 就是需要暴露的分组列表,需要的自己定义来源 本文章参考 https://www.cnblogs.com/caijt/p/10739841.html 改写的 一对多分组模式。需要一对一的可以参考 Asp.Net Core Swagger 接口分组(支持接口一对多暴露) 标签:width def title 判断 services false 核心 包含 count() 原文地址:https://www.cnblogs.com/YunRuiSoftWare/p/13576485.html1 c.DocInclusionPredicate((docName, apiDescription) =>
2 {
3 //docName分组 的apiDescription 方法是否暴露
4 //return true 暴露 反之 隐藏
5 return true;
6 });
1 public class ApiGroupAttribute : Attribute
2 {
3 public ApiGroupAttribute(params ApiGroupNames[] name)
4 {
5 GroupName = name;
6 }
7
8 public ApiGroupNames[] GroupName { get; set; }
9
10 }
11
12 public enum ApiGroupNames
13 {
14 [GroupInfo(Title = "登录接口", Description = "用于登录", Version = "20200828")]
15 Login,
16 }
17
18 public class GroupInfoAttribute : Attribute
19 {
20 public string Title { get; set; }
21 public string Version { get; set; }
22 public string Description { get; set; }
23 }
1 //可加载多个标签,用于1个接口对应多个分组
2 [ApiGroup(ApiGroupNames.Login,ApiGroupNames.SubmitProgram)]
1 services.AddSwaggerGen(c =>
2 {
3 //遍历ApiGroupNames所有枚举值生成接口文档,Skip(1)是因为Enum第一个FieldInfo是内置的一个Int值
4 typeof(ApiGroupNames).GetFields().Skip(1).ToList().ForEach(f =>
5 {
6 //获取枚举值上的特性
7 if (SwaggerEnumNames.Count(x => x.ToLower() == f.Name.ToLower()) > 0)
8 {
9 var info = f.GetCustomAttributes(typeof(GroupInfoAttribute), false).OfType
1 //判断接口归于哪个分组
2 c.DocInclusionPredicate((docName, apiDescription) =>
3 {
4 //反射拿到值
5 var actionlist = apiDescription.ActionDescriptor.EndpointMetadata.Where(x => x is ApiGroupAttribute);
6 if (actionlist.Count() > 0)
7 {
8 //判断是否包含这个分组
9 var actionfilter = actionlist.FirstOrDefault() as ApiGroupAttribute;
10 return actionfilter.GroupName.Count(x => x.ToString() == docName) > 0;
11 }
12 return false;
13 }
14 });
上一篇:v-text和v-html的区别
下一篇:网站服务——静态网站
文章标题:Asp.Net Core Swagger 接口分组(支持接口一对多暴露)
文章链接:http://soscw.com/index.php/essay/40686.html