zoukankan      html  css  js  c++  java
  • Asp.Net Core Swagger 接口分组(支持接口一对多暴露)

    开始之前,先介绍下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 改写的 一对多分组模式。需要一对一的可以参考

  • 相关阅读:
    人生
    问模板函数、函数模板,模板类、类模板的区别的问题?
    李清照
    重师者王,重友者霸,重己者亡
    C++ Primer(第4版)习题解答
    C#设计模式(1)转载
    C#设计模式(5)
    C#设计模式(2)
    C# 编码规范和编程好习惯
    C#设计模式(4)
  • 原文地址:https://www.cnblogs.com/YunRuiSoftWare/p/13576485.html
Copyright © 2011-2022 走看看