.NETCORE中关于swagger的分组

news/2024/5/20 0:28:43 标签: .netcore

有些时候我们的项目接口过多,就希望对应的swagger能够执行分组,网络上的几乎是千篇一律的分组方法,会累死!

这里提供一个更加高效的分组方法,比如你可以说哪些模块分到哪个组,哪些权限分到哪个组!

先上代码:

                    //添加文档
                    options.SwaggerDoc("v1", new OpenApiInfo { Title = "基础的接口", Version = "v1" });
                    options.SwaggerDoc("open", new OpenApiInfo { Title = "公开的接口", Version = "open" });
                    options.SwaggerDoc("role", new OpenApiInfo { Title = "需要登陆的接口", Version = "role" });
                    options.DocInclusionPredicate((doc, api) =>
                    {
                        if (!api.TryGetMethodInfo(out System.Reflection.MethodInfo method))
                        {
                            Console.WriteLine("not method!");
                            return false;
                        }
                        //路径过滤,有时候我们基于其他模块的,可以基于路径屏蔽
                        //return (description.RelativePath.Contains("/app/") || description.RelativePath.Contains("/plan/"));
                        //查找Method的 也就是Action的
                        var _api0 = method.GetCustomAttributes(true).OfType<TypeFilterAttribute>().ToList();
                        foreach (var item in _api0)
                        {
                            if (item.ImplementationType == typeof(RoleAttribute))
                            {
                                return doc == "role";
                            }
                            //item.Arguments //这个就是过滤器的参数了
                        }
                        //查找外部的 也就是Controller的
                        if (method.ReflectedType != null)
                        {
                            var _apix = method.ReflectedType.GetCustomAttributes(true).OfType<TypeFilterAttribute>().ToList();
                            foreach (var item in _apix)
                            {
                                if (item.ImplementationType == typeof(RoleAttribute))
                                {
                                    return doc == "role";
                                }
                            }
                        }
                        //查找不是通过TypeFilter安装过滤器的
                        var _api1 = method.GetCustomAttributes(true).OfType<RoleAttribute>().Count();
                        if (_api1 > 0)
                        {
                            return doc == "role";
                        }
                        if(doc == "role") { return false; }
                        if(doc == "open") { return true; }
                        //v1全部显示
                        return doc == "v1";
                    });

上面中,RoleAttribute是我自定义的过滤器,用于校验权限的,就是当前登陆者拥有哪些权限,我们一般用2个地方添加过滤器,一个是添加到Controller上,他的所有Action都会生效这个过滤器,一个是直接在Action上添加过滤器,其实还有一个是全局注入,不过我觉得那个很少用。

带参形式的过滤器

        [HttpPost]
        [TypeFilter(typeof(RoleAttribute), Arguments = new object[] { "root", "root" })]
        public async Task<string> AddChat(ChatItemAddDto input)
        {
            return "发布成功";
        }

不带参数的过滤器

        [HttpPost]
        [RoleAttribute]
        public async Task<string> ReadMessage(int roomid = 0, int uid = 0)
        {
            return "";
        }

直接加入Controller里面的,他下面的所有Action都生效

    [ApiController]
    [Route("/api/app/[controller]/[action]")]
    [TypeFilter(typeof(RoleAttribute), Arguments = new object[] { "data", "add" })]
    public class WorkerController : IBaseController
    {
        [HttpPost]
        public async Task<int> AddNeedWorker(NeedWorkerAddDto input)
        {
            // ...
            return 1;
        }
    }

上面的文档判断其实还是有待改进的地方,不过留给大家自己折腾,毕竟需求不一样!

你可以按照过滤器的参数划分分组,也可以按照不同过滤器划分分组!

最后启用UI,代码如下

            app.UseAbpSwaggerUI(options =>
            {
                options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API");
                options.SwaggerEndpoint("/swagger/open/swagger.json", "公开的接口");
                options.SwaggerEndpoint("/swagger/role/swagger.json", "需要登陆的接口");
                //options.DocExpansion(DocExpansion.None);//是否展开或者收缩
            });

看别人的都是通过

        [ApiExplorerSettings(GroupName ="v1")]

来划分的,虽然灵活,但是累啊!都已经用权限拆分了,还折腾这个分组干嘛呢!


http://www.niftyadmin.cn/n/4966616.html

相关文章

SpringMVC中Controller层获取前端请求参数的几种方式

SpringMVC中Controller层获取前端请求参数的几种方式 1、SpringMVC自动绑定2、使用RequestParam 注解进行接收3、RequestBody注解&#xff08;1&#xff09; 使用实体来接收JSON&#xff08;2&#xff09;使用 Map 集合接收JSON&#xff08;3&#xff09; 使用 List集合接收JSO…

docker搭建owncloud,Harbor,构建镜像

1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 拉取镜像 docker pull owncloud docker pull mysql:5.6 2、安装搭建私有仓库 Harbor 1.下载docker-compose 2.安装harbor 3.编辑 harbor.yml文件 使用./intall.sh安装 4.登录 3、编写Dockerfile制作Web应用系…

SpingMVC拦截器-用户登录权限控制分析

视频链接&#xff1a;08-SpringMVC拦截器-用户登录权限控制代码实现2_哔哩哔哩_bilibili 114 1、做了一个用户跟角色添加的相关操作 1.1 这个后台工程&#xff0c;没有进行相关操作也能够进行登录&#xff1a; 2、现在我做一个用户的权限控制&#xff0c;如果当前我没有进行操…

完整的application.xml

<!-- 资源文件配置 --><beans profile"dev"><bean class"com.ningpai.util.CustomPropertyPlaceholderConfigurer"><property name"locations"><list><value>classpath:/com/ningpai/web/config/dev/jdbc.p…

Keepalived+Lvs(dr)调度器主备配置小实验

目录 前言 一、实验拓扑图 二、配置LVS&#xff08;dr&#xff09;模式 三、配置调配器热备 四、测试 总结 前言 Keepalived和LVS&#xff08;Linux Virtual Server&#xff09;是两个常用的开源软件&#xff0c;通常结合使用以提供高可用性和负载均衡的解决方案。 Keepalive…

微服务中间件--MQ

MQ MQa.安装RabbitMQb.消息模型c.SpringAMQP发送和接收d.WorkQueue模型e.发布订阅模型1) FanoutExchange2) DirectExchange3) TopicExchange f.消息转换器 MQ 同步调用的问题 微服务间基于Feign的调用就属于同步方式&#xff0c;存在一些问题。 耦合度高&#xff1a;每次加入…

4.5 TCP优化

TCP 三次握手的性能提升 三次握手的过程在一个 HTTP 请求的平均时间占比 10% 以上&#xff0c;所以要正确使用三次握手的中参数&#xff0c;需要先用netstat命令查看是哪个握手阶段出了问题&#xff0c;主动发起连接的客户端优化相对简单些&#xff0c;而服务端需要监听端口&a…

实验八 网卡驱动移植

【实验目的】 掌握 Linux 内核配置的基本方法&#xff0c;完成对网卡驱动、NFS 等相关功能的配置 【实验环境】 ubuntu 14.04 发行版FS4412 实验平台交叉编译工具&#xff1a;arm-none-linux-gnueabi- 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行&…