2021-01-06

接口 Swagger 部分Web API的隐藏

背景

Swagger是目前最受欢迎的REST APIs文档生成工具,同时也是API的在线测试工具。功能强大谁用谁知道。我就不用在这里推广它了。今天要解决的问题是:如果让一些特定的API接口在Swagger中不显示,即从Swagger中过滤掉一些不想展示的接口?通常我们使用Swagger都是通过指定要扫描的包或者扫描具有某些注解的Controller,来生成API,那么如果这其中还想过滤掉一些特定API怎么做呢?

实现方法

1、添加特性,隐藏swagger接口特性标识

 /// <summary>  ///  /// </summary>  /// <param name="swaggerDoc"></param>  /// <param name="context"></param>  public void Apply(SwaggerDocument 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);     }    }   }  } }

2、添加过滤器,自定义Swagger隐藏过滤器

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

3、修改SwaggerConfig,注入过滤器

   #region Swagger   services.AddSwaggerGen(c =>   {    c.SwaggerDoc("v1", new Info    {     Version = "v1",     Title = "接口文档",     Description = "接口文档-基础",     TermsOfService = "https://example.com/terms",     Contact = new Contact     {      Name = "XXX1111",      Email = "XXX1111@qq.com",      Url = "https://example.com/terms"     }     ,     License = new License     {      Name = "Use under LICX",      Url = "https://example.com/license",     }    });    c.SwaggerDoc("v2", new Info    {     Version = "v2",     Title = "接口文档",     Description = "接口文档-基础",     TermsOfService = "https://example.com/terms",     Contact = new Contact     {      Name = "XXX2222",      Email = "XXX2222@qq.com",      Url = "https://example.com/terms"     }     ,     License = new License     {      Name = "Use under LICX",      Url = "https://example.com/license",     }    });    c.OperationFilter<HttpHeaderOperationFilter>();    c.DocumentFilter<HiddenApiFilter>();    var "{Assembly.GetExecutingAssembly().GetName().Name}.";    var  Path.Combine(AppContext.BaseDirectory, "CompanyName.ProjectName.ICommonServer."));   });   

No comments:

Post a Comment