为Swagger增加接口隐藏功能

2023-05-09 20:33:20 浏览数 (2)

最近在升级一个开发.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上公开这个接口了。你学会了吗?

0 人点赞