首页 > 其他分享 >Swagger-接口分组篇

Swagger-接口分组篇

时间:2023-06-01 14:24:48浏览次数:52  
标签:ApiGroupNames Title System 接口 分组 using Swagger public

分组需求

开发中使用Swagger进行Api接口测试时常常会遇到以下情况:1.Controller中的Action、Model、DTO过多导致单页面加载时页面响应速度太慢  2.接口太多,如果用一个页面展示查找某个接口会很麻烦。虽然可以采用搜索方式解决此问题,但不推荐。

分组功能实现

1. 新建目录ApiGroup,并在该目录下创建三个文件

ApiGroupAttribute.cs(控制器特性)

ApiGroupNames.cs(系统分组枚举)

GroupInfoAttribute.cs(给系统分组枚举值增加相关信息的特性,这个主要是用于在Swagger分组时可关联Title,Version,Description值)

 1 using Microsoft.AspNetCore.Mvc.ApiExplorer;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Threading.Tasks;
 6 
 7 namespace Ming.ApiGroup
 8 {
 9     /// <summary>
10     /// 系统分组特性
11     /// </summary>
12     public class ApiGroupAttribute : Attribute, IApiDescriptionGroupNameProvider
13     {
14         public ApiGroupAttribute(ApiGroupNames name)
15         {
16             GroupName = name.ToString();
17         }
18 public string GroupName { get; set; } 19 } 20 }
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Threading.Tasks;
 5 
 6 namespace Ming.ApiGroup
 7 {
 8     /// <summary>
 9     /// 系统分组枚举值
10     /// </summary>
11     public enum ApiGroupNames
12     {
13         [GroupInfo(Title ="登录认证模块",Description ="登录认证相关模块")]
14         Auth,
15         [GroupInfo(Title = "权限模块", Description = "权限功能相关模块,如用户管理、角色管理、菜单管理、部门管理等待")]
16         PerMission,
17         [GroupInfo(Title = "单据模块", Description = "单据模块相关接口,如申购单、采购订单")]
18         BillCode
20 } 21 }
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Threading.Tasks;
 5 
 6 namespace Ming.ApiGroup
 7 {
 8     /// <summary>
 9     /// 系统模块枚举注释
10     /// </summary>
11     public class GroupInfoAttribute : Attribute
12     {
13         public string Title { get; set; }
14         public string Version { get; set; }
15         public string Description { get; set; }
16     }
17 }

 

2.修改AddSwaggerGen方法

 1 public void ConfigureServices(IServiceCollection services)
 2 {
 3     
 4     #region Swagger
 5     services.AddSwaggerGen(options =>
 6     {
 7         //遍历ApiGroupNames所有枚举值生成接口文档,Skip(1)是因为Enum第一个FieldInfo是内置的一个Int值
 8         typeof(ApiGroupNames).GetFields().Skip(1).ToList().ForEach(f =>
 9         {
10             //获取枚举值上的特性
11             var info = f.GetCustomAttributes(typeof(GroupInfoAttribute), false).OfType<GroupInfoAttribute>().FirstOrDefault();
12             options.SwaggerDoc(f.Name, new Swashbuckle.AspNetCore.Swagger.Info
13             {
14                 Title = info?.Title,
15                 Version = info?.Version,
16                 Description = info?.Description
17             });
18         });
19         //没有加特性的分到这个NoGroup上
20         options.SwaggerDoc("NoGroup", new Swashbuckle.AspNetCore.Swagger.Info
21         {
22             Title = "无分组"
23         });
24         //判断接口归于哪个分组
25         options.DocInclusionPredicate((docName, apiDescription) =>
26         {
27             if (docName == "NoGroup")
28             {
29                 //当分组为NoGroup时,只要没加特性的都属于这个组
30                 return string.IsNullOrEmpty(apiDescription.GroupName);
31             }
32             else
33             {
34                 return apiDescription.GroupName == docName;
35             }
36         });
37 }

 

3.修改UseSwaggerUI方法

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{

    #region Swagger
    app.UseSwagger();
    app.UseSwaggerUI(options =>
    {
        //遍历ApiGroupNames所有枚举值生成接口文档,Skip(1)是因为Enum第一个FieldInfo是内置的一个Int值
        typeof(ApiGroupNames).GetFields().Skip(1).ToList().ForEach(f =>
        {
            //获取枚举值上的特性
            var info = f.GetCustomAttributes(typeof(GroupInfoAttribute), false).OfType<GroupInfoAttribute>().FirstOrDefault();
            options.SwaggerEndpoint($"/swagger/{f.Name}/swagger.json", info != null ? info.Title : f.Name);

        });
        options.SwaggerEndpoint("/swagger/NoGroup/swagger.json", "无分组");
    });
    #endregion
}

 

4.控制器分组

[ApiGroup](ApiGroupNames.Auth)
public class HomeController:ControllerBase{
}

备注:未加特性标注的控制器则默认划分 “无分组”模块中。

标签:ApiGroupNames,Title,System,接口,分组,using,Swagger,public
From: https://www.cnblogs.com/mingcore/p/17448777.html

相关文章

  • 有赞 调用 api 接口(有赞开放平台)
    ps:先注册有赞账号有赞https://www.youzan.com/有赞开放平台http://open.youzan.com/有赞开发者后台http://open.youzan.com/developer/app/index接入说明:http://open.youzan.com/docAPI文档:http://open.youzan.com/api***********************************************......
  • wireshark 查找 DNS 域名——编辑里查找 选择分组详情里去按照字符串搜索即可
    ......
  • 对接第三方接口教程(发送Http请求及返回参数处理)
    1.首先Http工具类建议使用 packagecn.hutool.http;//这个包下面的HttpUtil.post(StringurlString,Stringbody)这个方法会省去很多事情,不用去设置header的一些基本东西,get就不说了,get也能用post请求,把参数拼url后边就行了2.要看第三方接口的鉴权是如何做的,如果是t......
  • BMCOIN: 清单和工艺路线接口
      导入BOM出错。运行“清单和工艺路线接口”请求。路径:BOM>>清单和工艺路线接口。解决方式:Updateinv.mtl_system_items_bSetreplenish_to_order_flag=‘Y’–按订单装配WHEREINVENTORY_ITEM_ID=2054193 --料号#150305130013AM*2054192ANDORGAINIZATION_ID=......
  • vue+element项目中统一处理接口异常,只提示一次异常信息
     有时候一个页面会同时调多个接口,但是多个接口异常,需要做提示,那么提示的时候会弹出很多的提示信息,这无疑让体验感降低很多。 所以针对这种情况,我们配合elementUI统一做一个异常状态的处理,只能显示一次提示的功能,后续代码调接口的时候也可以省略去写异常状态下的逻辑了。首先......
  • [SprigMVC/SpringBoot] JSON序列化专题之日期序列化问题:接口报Jackson框架错误“Inva
    0序言今日工作中遇到的一个bug。各位看官且听我娓娓道来。1问题描述请求接口时,service层返回到controller层的数据结构为List<Map<Strig,Object>>,而Map中存在一个key=date,valuetype=java.time.LocalDate的Entry,且日志报如下错误:InvalidDefinitionException:Java8date......
  • 接口和抽象类的区别
    接口和抽象类的区别:(1)接口接口使用interface修饰;接口不能实例化;类可以实现多个接口;①java8之前,接口中的方法都是抽象方法,省略了publicabstract。②java8之后;接口中可以定义静态方法,静态方法必须有方法体,普通方法没有方法体,需要被实现;(2)抽象类抽象类使用abstract修饰;抽象类不能......
  • SoapUI、Jmeter、Postman三种接口测试工具的比较
    1. 用例组织方式首先是用例组织方式的不同,不同的目录结构与组织方式代表不同工具的测试思想,学习一个测试工具应该首先了解其组织方式。SoapUI的组织方式如下图,最上层是WorkSpace,每个窗口只可以打开一个WorkSpace(这是一个xml文件),每个Project也是一个单独的xml文件(为了协同工作,......
  • POSIX 进程间通信 (可移植操作系统接口)
    1、什么是POSIX标准PortableOperatingSystemInterfaceforComputingSystem.他是一个针对操作系统(准确地说是针对类Unix操作系统)的标准化协议。这个协议是对操作系统服务接口的标准化,从而保证了应用程序在源码层次的可移植性。如今主流的Linux系统都做到了兼容POSIX标准。......
  • 基于Jmeter+ant+Jenkins+钉钉机器人群通知的接口自动化测试
    博主写的非常好https://www.cnblogs.com/tdp0108/p/17446834.html#top前言   搭建jmeter+ant+jenkins环境有些前提条件,那就是要先配置好java环境,本地java环境至少是JDK8及以上版本,最好是JAVA11或者JAVA17等较高的java环境,像jenkins这种持续构建工具基本都在向上兼容JAVA的......