Asp.Net Core Swagger 接口分組(支持接口一對(duì)多暴露)
開始之前,先介紹下swagger常用方法。
services.AddSwaggerGen //添加swagger中間件
c.SwaggerDoc //配置swagger文檔,也就是右上角的下拉框內(nèi)容

c.IncludeXmlComments //引用程序集xml,用于加載出 備注信息等如圖

c.AddSecurityDefinition //添加授權(quán)驗(yàn)證

c.DocInclusionPredicate //核心方法,指定分組被加載時(shí) 回調(diào)進(jìn)入,也就是swagger右上角下拉框內(nèi)的分組加載時(shí)
每一個(gè)分組加載時(shí)都會(huì)遍歷所有控制器的action 進(jìn)入一次這個(gè)方法體內(nèi),返回true則 暴露 否則隱藏
1 c.DocInclusionPredicate((docName, apiDescription) => 2 { 3 //docName分組 的apiDescription 方法是否暴露 4 //return true 暴露 反之 隱藏 5 return true; 6 });
多分組步驟:
1.定義自定義標(biāo)簽
1 public class ApiGroupAttribute : Attribute 2 { 3 public ApiGroupAttribute(params ApiGroupNames[] name) 4 { 5 GroupName = name; 6 } 7 8 public ApiGroupNames[] GroupName { get; set; } 9 10 } 11 12 public enum ApiGroupNames 13 { 14 [GroupInfo(Title = "登錄接口", Description = "用于登錄", Version = "20200828")] 15 Login, 16 } 17 18 public class GroupInfoAttribute : Attribute 19 { 20 public string Title { get; set; } 21 public string Version { get; set; } 22 public string Description { get; set; } 23 }
2.將標(biāo)簽放在需要 分組的控制器或方法上
1 //可加載多個(gè)標(biāo)簽,用于1個(gè)接口對(duì)應(yīng)多個(gè)分組 2 [ApiGroup(ApiGroupNames.Login,ApiGroupNames.SubmitProgram)]
3.利用枚舉反射加載出每個(gè)分組的Doc
1 services.AddSwaggerGen(c => 2 { 3 //遍歷ApiGroupNames所有枚舉值生成接口文檔,Skip(1)是因?yàn)镋num第一個(gè)FieldInfo是內(nèi)置的一個(gè)Int值 4 typeof(ApiGroupNames).GetFields().Skip(1).ToList().ForEach(f => 5 { 6 //獲取枚舉值上的特性 7 if (SwaggerEnumNames.Count(x => x.ToLower() == f.Name.ToLower()) > 0) 8 { 9 var info = f.GetCustomAttributes(typeof(GroupInfoAttribute), false).OfType<GroupInfoAttribute>().FirstOrDefault(); 10 c.SwaggerDoc(f.Name, new Microsoft.OpenApi.Models.OpenApiInfo 11 { 12 Title = info?.Title, 13 Version = info?.Version, 14 Description = info?.Description 15 }); 16 } 17 }); 18 }
4.DocInclusionPredicate 內(nèi)寫核心邏輯代碼,利用反射的類進(jìn)行判斷標(biāo)簽值
1 //判斷接口歸于哪個(gè)分組 2 c.DocInclusionPredicate((docName, apiDescription) => 3 { 4 //反射拿到值 5 var actionlist = apiDescription.ActionDescriptor.EndpointMetadata.Where(x => x is ApiGroupAttribute); 6 if (actionlist.Count() > 0) 7 { 8 //判斷是否包含這個(gè)分組 9 var actionfilter = actionlist.FirstOrDefault() as ApiGroupAttribute; 10 return actionfilter.GroupName.Count(x => x.ToString() == docName) > 0; 11 } 12 return false; 13 } 14 });
如需要全部接口暴露并不用打標(biāo)簽的,用SwaggerDoc單獨(dú)加載一個(gè)Doc用于顯示全部接口,在DocInclusionPredicate內(nèi)加入 判斷 如果docName等于全部接口的DocName那么直接return true即可,可靈活運(yùn)行,可配置在json 也可配置在數(shù)據(jù)庫等地方。用于指定分組是否暴露。以上加載Doc時(shí), SwaggerEnumNames 就是需要暴露的分組列表,需要的自己定義來源
本文章參考 http://www.rzrgm.cn/caijt/p/10739841.html 改寫的 一對(duì)多分組模式。需要一對(duì)一的可以參考

浙公網(wǎng)安備 33010602011771號(hào)