• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Asp.NetCoreSwagger接口分组(支持接口一对多暴露)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

开始之前,先介绍下swagger常用方法。

services.AddSwaggerGen    //添加swagger中间件

c.SwaggerDoc  //配置swagger文档,也就是右上角的下拉框内容

 

c.IncludeXmlComments  //引用程序集xml,用于加载出 备注信息等如图

 

 

c.AddSecurityDefinition  //添加授权验证

 

 

 c.DocInclusionPredicate    //核心方法,指定分组被加载时 回调进入,也就是swagger右上角下拉框内的分组加载时

每一个分组加载时都会遍历所有控制器的action 进入一次这个方法体内,返回true则 暴露 否则隐藏

1                     c.DocInclusionPredicate((docName, apiDescription) =>
2                     {
3                           //docName分组 的apiDescription 方法是否暴露
4                           //return true 暴露 反之 隐藏
5                           return true;
6                     });
DocInclusionPredicate 使用

多分组步骤:

1.定义自定义标签

 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     }
标签代码

2.将标签放在需要 分组的控制器或方法上

1 //可加载多个标签,用于1个接口对应多个分组
2 [ApiGroup(ApiGroupNames.Login,ApiGroupNames.SubmitProgram)]
使用标签

3.利用枚举反射加载出每个分组的Doc

 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<GroupInfoAttribute>().FirstOrDefault();
10                             c.SwaggerDoc(f.Name, new Microsoft.OpenApi.Models.OpenApiInfo
11                             {
12                                 Title = info?.Title,
13                                 Version = info?.Version,
14                                 Description = info?.Description
15                             });
16                         }
17                     });
18 }
View Code

4.DocInclusionPredicate 内写核心逻辑代码,利用反射的类进行判断标签值

 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                     });
DocInclusionPredicate逻辑代码

 

如需要全部接口暴露并不用打标签的,用SwaggerDoc单独加载一个Doc用于显示全部接口,在DocInclusionPredicate内加入 判断 如果docName等于全部接口的DocName那么直接return true即可,可灵活运行,可配置在json 也可配置在数据库等地方。用于指定分组是否暴露。以上加载Doc时, SwaggerEnumNames 就是需要暴露的分组列表,需要的自己定义来源

 

本文章参考 https://www.cnblogs.com/caijt/p/10739841.html 改写的 一对多分组模式。需要一对一的可以参考


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap