Asp.Net Core Swagger 接口分组(支持接口一对多暴露)
开始之前,先介绍下swagger常用方法。
services.AddSwaggerGen //添加swagger中间件
c.SwaggerDoc //配置swagger文档,也就是右上角的下拉框内容

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

c.AddSecurityDefinition //添加授权验证

c.DocInclusionPredicate //核心方法,指定分组被加载时 回调进入,也就是swagger右上角下拉框内的分组加载时
每一个分组加载时都会遍历所有控制器的action 进入一次这个方法体内,返回true则 暴露 否则隐藏

c.DocInclusionPredicate((docName, apiDescription) =>
{
//docName分组 的apiDescription 方法是否暴露
//return true 暴露 反之 隐藏
return true;
});
DocInclusionPredicate 使用
多分组步骤:
1.定义自定义标签

public class ApiGroupAttribute : Attribute
{
public ApiGroupAttribute(params ApiGroupNames[] name)
{
GroupName = name;
} public ApiGroupNames[] GroupName { get; set; } } public enum ApiGroupNames
{
[GroupInfo(Title = "登录接口", Description = "用于登录", Version = "")]
Login,
} public class GroupInfoAttribute : Attribute
{
public string Title { get; set; }
public string Version { get; set; }
public string Description { get; set; }
}
标签代码
2.将标签放在需要 分组的控制器或方法上

//可加载多个标签,用于1个接口对应多个分组
[ApiGroup(ApiGroupNames.Login,ApiGroupNames.SubmitProgram)]
使用标签
3.利用枚举反射加载出每个分组的Doc

services.AddSwaggerGen(c =>
{
//遍历ApiGroupNames所有枚举值生成接口文档,Skip(1)是因为Enum第一个FieldInfo是内置的一个Int值
typeof(ApiGroupNames).GetFields().Skip().ToList().ForEach(f =>
{
//获取枚举值上的特性
if (SwaggerEnumNames.Count(x => x.ToLower() == f.Name.ToLower()) > )
{
var info = f.GetCustomAttributes(typeof(GroupInfoAttribute), false).OfType<GroupInfoAttribute>().FirstOrDefault();
c.SwaggerDoc(f.Name, new Microsoft.OpenApi.Models.OpenApiInfo
{
Title = info?.Title,
Version = info?.Version,
Description = info?.Description
});
}
});
}
4.DocInclusionPredicate 内写核心逻辑代码,利用反射的类进行判断标签值

//判断接口归于哪个分组
c.DocInclusionPredicate((docName, apiDescription) =>
{
//反射拿到值
var actionlist = apiDescription.ActionDescriptor.EndpointMetadata.Where(x => x is ApiGroupAttribute);
if (actionlist.Count() > )
{
//判断是否包含这个分组
var actionfilter = actionlist.FirstOrDefault() as ApiGroupAttribute;
return actionfilter.GroupName.Count(x => x.ToString() == docName) > ;
}
return false;
}
});
DocInclusionPredicate逻辑代码
如需要全部接口暴露并不用打标签的,用SwaggerDoc单独加载一个Doc用于显示全部接口,在DocInclusionPredicate内加入 判断 如果docName等于全部接口的DocName那么直接return true即可,可灵活运行,可配置在json 也可配置在数据库等地方。用于指定分组是否暴露。以上加载Doc时, SwaggerEnumNames 就是需要暴露的分组列表,需要的自己定义来源
本文章参考 https://www.cnblogs.com/caijt/p/10739841.html 改写的 一对多分组模式。需要一对一的可以参考
Asp.Net Core Swagger 接口分组(支持接口一对多暴露)的更多相关文章
- ASP.NET Core WebApi基于JWT实现接口授权验证
一.ASP.Net Core WebApi JWT课程前言 我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再 ...
- ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF SQLite 支持 上一章节我有提 ...
- .NET Core Swagger 的分组使, 以及相同Action能被多个分组公用,同时加载出尚未分组的数据出来
1.本文章参考 点击链接跳转 改写的 一对多分组模式.需要一对一的可以参考 2.本文主要讲的是 一对多 分组公用, 同时把尚未分组的加载出来 3.效果演示GIF图: 具体操作代码如下: 1.在项目创建 ...
- Asp.Net Core: Swagger 与 Identity Server 4
Swagger不用多说,可以自动生成Web Api的接口文档和客户端调用代码,方便开发人员进行测试.通常我们只需要几行代码就可以实现这个功能: ... builder.Services.AddSwag ...
- ASP.NET Core Swagger接入使用IdentityServer4 的 WebApi
写在前面 是这样的,我们现在接口使用了Ocelot做网关,Ocelot里面集成了基于IdentityServer4开发的授权中心用于对Api资源的保护.问题来了,我们的Api用了SwaggerUI做接 ...
- asp.net core swagger使用及注意事项
Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.是一款RESTFUL接口的文档在线自动生成+功能测试软件.主要目的是构建标准的.稳定的.可重 ...
- 如何使用vs将asp.net core项目添加容器支持并发布docker镜像到私有dockerhub和添加k8s/helm管理
这篇文章介绍一下,如何使用VS2017给asp.net core添加容器支持,并发布镜像到私有docker hub,然后用chart管理容器镜像的操作流程. 话不多说,just do it. 新建项目 ...
- ASP .NET CORE 根据环境变量支持多个 appsettings.json
0.背景 在开发项目的过程当中,生产环境与调试环境的配置肯定是不一样的.拿个最简单的例子来说,比如连接字符串这种东西,调试环境肯定是不能连接生产数据库的.在之前的话,这种情况只能说是你 COPY 两个 ...
- ASP.NET Core 中的 WebSocket 支持(转自MSDN)
本文介绍 ASP.NET Core 中 WebSocket 的入门方法. WebSocket (RFC 6455) 是一个协议,支持通过 TCP 连接建立持久的双向信道. 它用于从快速实时通信中获益的 ...
随机推荐
- luogu P5826 【模板】子序列自动机 主席树 vector 二分
LINK:子序列自动机 想了一些很有趣的做法. dp 容易看出 f[i][j]表示前i个数匹配了j个数的dp 不过复杂度很高. 贪心 容易想到匹配的时候每个数字尽量往前匹配 这样显然是最优的 复杂度Q ...
- P3250 [HNOI2016]网络
LINK:网络 一棵树 每次添加一条路径 或者删除之前的一条路径 或询问除了不经过某个点之外剩下的最大值. 一个显然的思路 对于一条路径的权值我们直接把权值塞上去 标记永久化一下即可. 考虑如何求答案 ...
- Canal工作原理
摘自:http://www.importnew.com/25189.html 背景 mysql主备复制实现: 从上层来看,复制分成三步: master将改变记录到二进制日志(binary log)中( ...
- LeetCode 87,远看是字符串其实是搜索,你能做出来吗?
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第54篇文章,我们一起来看LeetCode 87题,Scramble String(爬行字符串). 这题的官方难度 ...
- 解决Vue中element-ui输入框无法输入问题
<el-input placeholder="请输入内容" v-model="input3" class="input-with-select& ...
- Hexo小技巧(包括如何插入本地图片)
我在研究如何在Hexo中引用本地图片时,看到官方文档对此问题已给出了解决方法,并亲测有效.当然,我并不满足于仅仅知道这一个技巧.在大致阅读过官方文档后,我总结了之前我个人并不知道的几个关于Hexo写博 ...
- 007_对go语言中的自定义排序sort的小练习
在go语言基础知识中,有个知识点是go语言的自定义排序,我在学习完之后,自己做了一些小练习和总结. 首先按照惯例,还是呈上代码演示: package main import "fmt&quo ...
- Python 中 3 个不可思议的返回
第一个:神奇的字典键 some_dict = {} some_dict[5.5] = "Ruby" some_dict[5.0] = "JavaScript" ...
- SonarQube 跳过指定检查
SonarQube 跳过指定检查 如何让 SonarQube 忽略某些检查规则 环境 演示环境参考前边的文章 SonarQube 扫描 Java 代码 步骤 我们已经扫描一个 Java 项目 有 6 ...
- vue-loader处理vue文件
loader:"vue-loader" ,引导vue文件被vue-loader/lib/index.js处理 第一步:解析vue文件 const utils = require(' ...