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