程序地带

接口 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 = "[email protected]",
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 = "[email protected]",
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



 


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lyl6796910/p/14240601.html

随机推荐

巧用CSS cross-fade()实现背景图像半透明效果

前段时间有挺火的一个小游戏,拿两张图片叠加在一起,看看复合人物的效果,用css怎么实现呢?可能大部分人想到的是将两个img用定位的方式叠加在一起...

千锋教育官方博客 阅读(350)

编程式事务管理(详解)

第一章:编程式事务管理(详解)1.说明:Spring为了简化事务管理的代码:提供了模板类TransactionTemplate,所...

youngPengWang 阅读(159)

Java标准类和JavaBean的理解

标题一个标准类通常包括四个部分:1.所有成员变量都要用private关键字修饰2.为每一个成员变量编写一对Getter/Setter方法3.编写一个无参数的构造方法4.编写一个全参数的构...

文七刀 阅读(379)

Gartner魔力象限的解读与增强分析实践

​近日,Gartner发布了最新一期的《数据分析和商业智能平台魔力象限》报告。报告指出,如今商业智能(BI)平台关键的差异化因素是在单一平台上增...

思迈特Smartbi 阅读(349)

Centos初始化网卡设置

初始化网卡设置1.切换到网卡设置cd/etc/sysconfig/network-scripts2.查看当前网卡ls-l一般情况下,第一个就是网卡名。这里是:ifcfg-e...

xiaoyurainzi 阅读(481)