前言
前面的《使用.Net5尝鲜的一些小总结及Configuration.Json读取配置文件的使用》文章中简单说过.Net5的项目自动集成了Swagger中间件,对做Api接口进行测试方便了很多,平时做程序人的人应该也都会有这样的经历,写了不少代码或是API后,可能用不到,直接把代码删了会可惜,万一以后用到了呢,但是显示出来太多测试也比较麻烦,所以这篇就来说说怎么让Swagger的API实现部分隐藏。
实现效果
隐藏前
隐藏后
从上面两图中可以看到,在Test的Controller中原本是有三个API的,使用了隐藏后最后只有一个Api显示在外面。实现在Swagger中隐藏Api的方式我们就利用到了特性Attribute,关于特征在《【干货】C#自定义特性(Attribute)讲解与实际应用》有详细的讲解,可以直接看那篇文章来了解c#中的特性。
# | Swagger隐藏Api |
---|---|
1 | 创建一个IDocumentFilter的继承类,实现隐藏接口特性标识 |
2 | 在Startup的ConfigureServices中针对AddSwaggerGen的项中加入DocumentFilter的过滤 |
3 | 在想要隐藏的Api上面加入我们定义好的特性 |
代码实现
微卡智享
01
创建IDocumentFilter类
在项目中创建了一个SwaggerApi的类,继承自IDocumentFilter
实现上图红框中Apply的接口方式,然后再添加一个方法如上图蓝框中,用于标识隐藏特性。
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace MedicalPlatform
{
public class SwaggerApi : IDocumentFilter
{
/// <summary>
/// 隐藏swagger接口特性标识
/// </summary>
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class HideApiAttribute : System.Attribute
{
}
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
foreach (ApiDescription description in context.ApiDescriptions)
{
if (description.TryGetMethodInfo(out MethodInfo method))
{
if (method.ReflectedType.CustomAttributes.Any(t => t.AttributeType == typeof(HideApiAttribute))
|| method.CustomAttributes.Any(t => t.AttributeType == typeof(HideApiAttribute)))
{
string key = "/" + description.RelativePath;
if (key.Contains("?"))
{
int idx = key.IndexOf("?", System.StringComparison.Ordinal);
key = key.Substring(0, idx);
}
swaggerDoc.Paths.Remove(key);
}
}
}
}
}
}
02
修改Startup启动项
在Startup的类中ConfigureServices方法中针对services.AddSwaggerGen中再加入一行代码用于实现过滤API
//新加入代码
c.DocumentFilter<SwaggerApi>();
03
对隐藏的API加入特性
最后我们只要对想要隐藏的Api加上特性,即可实现隐藏效果了。
上图中可以看到,我们在Test的控制器中前两个方法里加入了[SwaggerApi.HideApi]特性,而这个特性就是定义的SwaggerApi的新加入的那个HideApi的方法,如下:
这样我们就可以实现文章开头里隐藏后的界面效果。