前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.Net5中Swagger采用Attribute方式实现Api隐藏

.Net5中Swagger采用Attribute方式实现Api隐藏

作者头像
Vaccae
发布2021-02-05 11:21:27
1.3K0
发布2021-02-05 11:21:27
举报
文章被收录于专栏:微卡智享微卡智享

前言

前面的《使用.Net5尝鲜的一些小总结及Configuration.Json读取配置文件的使用》文章中简单说过.Net5的项目自动集成了Swagger中间件,对做Api接口进行测试方便了很多,平时做程序人的人应该也都会有这样的经历,写了不少代码或是API后,可能用不到,直接把代码删了会可惜,万一以后用到了呢,但是显示出来太多测试也比较麻烦,所以这篇就来说说怎么让Swagger的API实现部分隐藏。

实现效果

隐藏前

隐藏后

从上面两图中可以看到,在Test的Controller中原本是有三个API的,使用了隐藏后最后只有一个Api显示在外面。实现在Swagger中隐藏Api的方式我们就利用到了特性Attribute,关于特征在《【干货】C#自定义特性(Attribute)讲解与实际应用》有详细的讲解,可以直接看那篇文章来了解c#中的特性。

实现思路

#

Swagger隐藏Api

1

创建一个IDocumentFilter的继承类,实现隐藏接口特性标识

2

在Startup的ConfigureServices中针对AddSwaggerGen的项中加入DocumentFilter的过滤

3

在想要隐藏的Api上面加入我们定义好的特性

代码实现

微卡智享

01

创建IDocumentFilter类

在项目中创建了一个SwaggerApi的类,继承自IDocumentFilter

实现上图红框中Apply的接口方式,然后再添加一个方法如上图蓝框中,用于标识隐藏特性。

代码语言:javascript
复制
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;

namespace MedicalPlatform
{
    public class SwaggerApi : IDocumentFilter
    {
        /// <summary>
        /// 隐藏swagger接口特性标识
        /// </summary>
        [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
        public class HideApiAttribute : System.Attribute
        {
        }


        public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
            foreach (ApiDescription description in context.ApiDescriptions)
            {
                if (description.TryGetMethodInfo(out MethodInfo method))
                {
                    if (method.ReflectedType.CustomAttributes.Any(t => t.AttributeType == typeof(HideApiAttribute))
                            || method.CustomAttributes.Any(t => t.AttributeType == typeof(HideApiAttribute)))
                    {
                        string key = "/" + description.RelativePath;
                        if (key.Contains("?"))
                        {
                            int idx = key.IndexOf("?", System.StringComparison.Ordinal);
                            key = key.Substring(0, idx);
                        }
                        swaggerDoc.Paths.Remove(key);
                    }
                }
            }
        }
    }
}

02

修改Startup启动项

在Startup的类中ConfigureServices方法中针对services.AddSwaggerGen中再加入一行代码用于实现过滤API

代码语言:javascript
复制
  //新加入代码
c.DocumentFilter<SwaggerApi>();

03

对隐藏的API加入特性

最后我们只要对想要隐藏的Api加上特性,即可实现隐藏效果了。

上图中可以看到,我们在Test的控制器中前两个方法里加入了[SwaggerApi.HideApi]特性,而这个特性就是定义的SwaggerApi的新加入的那个HideApi的方法,如下:

这样我们就可以实现文章开头里隐藏后的界面效果。

本文参与?腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-01,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体同步曝光计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现思路
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com