前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为Swagger增加接口隐藏功能

为Swagger增加接口隐藏功能

原创
作者头像
谭广健
发布2023-05-09 20:33:20
1.6K0
发布2023-05-09 20:33:20
举报
文章被收录于专栏:谭广健的专栏谭广健的专栏

最近在升级一个开发.NET6的框架,从数据表的自动构建,数据类、控制器和视图文件及相关基本组件自动生成基本搞掂,感觉已经傻瓜式开发了。于是考虑数据开放性,所以搞一个数据API的接口,于是于是用Swagger这个,有些同学可能对Swagger有些陌生,科普一下吧。

Swagger是一个用于生成、描述和调用 RESTful 接口的 Web 服务。就是已经集成在线说明文档,调用介绍及测试的一体软件。如果按以前的套路就文档要写一份,开发也要做一次,并且还要调用外部工具进行测试,而现在Swagger全部集成了,一次开发全部搞掂,省事省力。

的确省事省力但是有一个潜在的问题就是,因为开发即公开,当开发了一个API接口后,Swagger就会直接暴露和可以进行调试,这样不是太稳定,因为有些接口是配合在某些场合用的,如果全部公开可以会被别有用心的人进行工具,那怎么办呢?好在我看到Swagger可以设置接口的特性,例如是POST还是GET的,那行我们做一个特性过滤就可以了。

一、首先声明一个特性。

代码语言:javascript
复制
    /// <summary>
    /// 隐藏接口,不生成到swagger文档展示(Swashbuckle.AspNetCore 5.0.0)
    /// </summary>
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
    public partial class HiddenApiAttribute : Attribute { }

二、然后就针对这个特性进行过滤,过滤前先进行继承重写。

代码语言:javascript
复制
  public class HiddenApiFilter : IDocumentFilter
    {
        /// <summary>
        /// 重写Apply方法,移除隐藏接口的生成
        /// </summary>
        /// <param name="swaggerDoc">swagger文档文件</param>
        /// <param name="context"></param>
        public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
        {
            foreach (ApiDescription apiDescription in context.ApiDescriptions)
            {
                if (apiDescription.TryGetMethodInfo(out MethodInfo method))
                {
                    if (method.ReflectedType.CustomAttributes.Any(t => t.AttributeType == typeof(HiddenApiAttribute))
                      || method.CustomAttributes.Any(t => t.AttributeType == typeof(HiddenApiAttribute)))
                    {
                        string key = "/" + apiDescription.RelativePath;
                        if (key.Contains("?"))
                        {
                            int idx = key.IndexOf("?", System.StringComparison.Ordinal);
                            key = key.Substring(0, idx);
                        }
                        swaggerDoc.Paths.Remove(key);
                    }
                }
            }
        }

    }

好了,这个就是将控制器文件循环读入进行判断和过滤特性的,下面就到关键点。

三、配置它并让它生效。

代码语言:javascript
复制
  config.DocumentFilter<HiddenApiFilter>();//过滤的核心filter
  config.IncludeXmlComments(xmlPath, true); //添加控制器层注释(true表示显示控制器注释)

别少看上面那句话,这可是核心中的核心。没有它之前的全白费的,这个就是统筹上面的,好了这个搞掂。之后只需要想不显示的接口前加入[HiddenApi],这样就可以不在Swagger上公开这个接口了。你学会了吗?

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档