接口 Swagger 部分Web API的隐藏

共 4565字,需浏览 10分钟

 ·

2021-04-11 22:57


背景

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 xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); c.IncludeXmlComments(xmlPath); c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, $"CompanyName.ProjectName.ICommonServer.xml")); });
#endregion Swagger

测试

   /////// <summary>        /////// 检测帐号是不已存在        /////// </summary>        /////// <param name="account">(必填)帐号或手机号    Data=true 已存在,Data=false 不存在</param>        /////// <returns>测试</returns>        ////[HttpGet, Route("existAccount")]        ////[ApiExplorerSettings(GroupName = "v2")]        //////[HiddenApi]        ////public R<bool> ExistAccount([FromQuery] string account)        ////{        ////    return R<bool>.Suc(true);        ////}

开源地址

https://github.com/conanl5566/Sampleproject/tree/master/src/03%20Host/CompanyName.ProjectName.HttpApi.Host


往期精彩回顾




【推荐】.NET Core开发实战视频课程 ★★★

.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

【.NET Core微服务实战-统一身份认证】开篇及目录索引

Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)

.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

10个小技巧助您写出高性能的ASP.NET Core代码

用abp vNext快速开发Quartz.NET定时任务管理界面

在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度

现身说法:实际业务出发分析百亿数据量下的多表查询优化

关于C#异步编程你应该了解的几点建议

C#异步编程看这篇就够了


浏览 25
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报