首页 > 其他分享 >为控制器生成OpenAPI注释

为控制器生成OpenAPI注释

时间:2023-07-04 14:34:00浏览次数:56  
标签:控制器 盖度 CoverageData OpenAPI 注释 swagger options

非常喜欢. NET 的 /// 注释,写代码的时候就顺道完成写文档的过程,简直不要太爽了。 ASP. NET CORE 也是一样的,通过 Swagger 工具,可以自动生成 API 的接口文档(OpenAPI规范),提供给前端使用,也可以用过 APIPOST/APIFOX 之类的工具提供给前端同学直接调用。

生成 OpenAPI 注释

只需要安装 swashbuckle.aspnetcore 包,在项目上设置生成 XML 格式的注释,并且如下配置即可自动生成 OpenAPI 的文档,对我这个例子,可以通过 swagger/v{version}/swagger.json 访问。

            services.AddSwaggerGen(options =>
            {
                // options.CustomSchemaIds(type => type.AssemblyQualifiedName);
                var fileName = Assembly.GetExecutingAssembly().GetName().Name + ".xml";
                var filePath = Path.Combine(AppContext.BaseDirectory, fileName);

                // integrate xml comments
                options.IncludeXmlComments(filePath);
            });


                app.UseSwagger();
                app.UseSwaggerUI(
                    options =>
                    {
                        foreach (var description in app.DescribeApiVersions())
                        {
                            var url = $"/swagger/{description.GroupName}/swagger.json";
                            var name = description.GroupName.ToUpperInvariant();
                            options.SwaggerEndpoint(url, name);
                        }
                    });

注释如下:

    /// <summary>
    /// 这个接口
    /// </summary>
    public class CoverageDataController : ODataController
	{
        /// <summary>
        /// 获取盖度数据
        /// </summary>
        /// <param name="key"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        [HttpGet]
        [ProducesResponseType(typeof(CoverageDataDto), Status200OK)]
        public async Task<IActionResult> Get(string key, ODataQueryOptions<CoverageDataDto> options)
        {
        }
    }

生成 Tags 注释

在使用 APIFOX 导入 swagger.json 导入时,我发现,对每一个 path 的注释能够正常显示,但是对的控制器的注释不能正常被识别。

image

查看生成的 swagger.json,这个 CoverageData 被解释成了 OpenAPI 的 Tags,那对应控制器的相关注释,是需要使用另外的标注实现的,而不能直接使用///的注释实现。

paths": {
        "/api/v{version}/CoverageData({key})": {
            "get": {
                "tags": [
                    "CoverageData"
                ],
                "summary": "获取盖度数据",

安装的新的包 swashbuckle.aspnetcore.annotations,然后增加启用语句,如下:

            services.AddSwaggerGen(options =>
            {
                // options.CustomSchemaIds(type => type.AssemblyQualifiedName);
                var fileName = Assembly.GetExecutingAssembly().GetName().Name + ".xml";
                var filePath = Path.Combine(AppContext.BaseDirectory, fileName);

                // integrate xml comments
                options.IncludeXmlComments(filePath);
                options.EnableAnnotations();
            });

在控制器的声明上面,添加 [SwaggerTag("接受盖度数据")] 注解:

    /// <summary>
    /// 这个接口
    /// </summary>
    [SwaggerTag("接受盖度数据")]
    public class CoverageDataController : ODataController
	{
    }

最后生成的 swagger.json 文件在末尾多了几行:

    "tags": [
        {
            "name": "CoverageData",
            "description": "接受盖度数据"
        }
    ]

Swagger 里面就可以看到注释了:

image

但是导入到 APIFOX 中,显示的组别名称依然是 CoverageData ,没有达到我想要的效果,我想将其替换成可以显示友好的名称。实质上是为 CoverageData 取一个别名。

注:这种方法不能与 swagger 配置的 TagActionsBy 方法的一起使用。

Tags 注解

在 ASP. NET CORE 中,可以在控制器上使用 [Tags("盖度接口")],对控制器的组别进行标注。这样生成的 tag 名称直接就换成了的中文名称。

"paths": {
        "/api/v{version}/CoverageData({key})": {
            "get": {
                "tags": [
                    "盖度接口"
                ],
                "summary": "获取盖度数据",

....

    "tags": [
        {
            "name": "CoverageData",
            "description": "接受盖度数据"
        }
    ]

但是 swagger 变得非常奇怪:

image

出现了两个不同的 tag,其中 CoverageData 名称的下面没有从属的 api。

如果没有对 Tag 写 description 的要求,那么使用这个方案是最简单的:设置[Tags],不要设置[SwaggerTag]。

DisplayName 注解

这么看应该是通过 swagger 生成的 tag 与通过 [Tags] 注解生成的 tag 对象不能匹配,导致 swagger 生成的没用被引用。

查了很久资料,说这个是一个现在的 Bug,有人通过重写 DisplayName,在帖子中给了临时的解决方案

  1. 先增加一个新的类型。
/// <summary>
/// Uses the [DisplayName] attribute as the Controller name in OpenAPI spec and Swagger/ReDoc UI if available else the default Controller name.
/// </summary>
public class ControllerDocumentationConvention : IControllerModelConvention
{
    void IControllerModelConvention.Apply(ControllerModel controller)
    {
        if (controller == null)
        {
            return;
        }
        
        foreach (var attribute in controller.Attributes)
        {
            if (attribute is DisplayNameAttribute displayNameAttribute && !string.IsNullOrWhiteSpace(displayNameAttribute.DisplayName))
            {
                controller.ControllerName = displayNameAttribute.DisplayName;
            }
        }
    }
}
  1. 给 Controller 配置这个命名转换。
services.AddControllers(o =>
{
   o.Conventions.Add(new ControllerDocumentationConvention());
});
  1. 在需要调整名称的控制器上添加 [DisplayName("targetNames")] 即可。可以看到名称与注释都得到的保留,最终效果如下:

image

导入 APIFOX 也可以正常识别了。

image

参考资料

标签:控制器,盖度,CoverageData,OpenAPI,注释,swagger,options
From: https://www.cnblogs.com/podolski/p/17525675.html

相关文章

  • SQL Server 查询数据表字段及字段注释
    SELECTCASEWHENcol.colorder=1THENobj.nameELSE''ENDAS表名,col.colorderAS序号,col.nameAS列名,ISNULL(ep.[value],'')AS列说明,t.nameAS数据类型,col.lengthAS长度,ISNULL(COLUMNPROPERTY(col.id,col.name,'Scale'),0)AS小数位数......
  • git代码提交 设置日志模板 对用户提交日志注释进行校验
    背景:由于公司项目管理需要,对开发人员的提交日志进行规范性约束。作为兼职的devops工程师,责无旁贷的去吭哧吭哧的研究了。公司主要使用git管理代码,gogs托管。作为领导眼中分分钟解决的问题,在真实上手研究还是需要一些时间成本的(鄙人主职还是研发)。思路:1、利用度娘和biying搜索了......
  • m基于simulink的PID控制器,模糊PID控制器以及MPC控制器性能对比仿真
    1.算法仿真效果matlab2022a仿真结果如下:        从图仿真结果可知,PID控制器,其超调较大,且控制器进入收敛状态时间也最长,。对于模糊PID控制器,其超调小于PID控制器,且收敛速度也较快,因此其性能优于传统的PID控制器。对于MPC控制器,其超调最小,控制器进入稳定状态速度也最快,......
  • 华为超聚变2288H V5 服务器安装Windows系统后 PCI数据捕获和信号处理控制器 出现感叹
    2288Hv5服务器安装Windows系统后,PCI数据捕获和信号处理控制器出现感叹号可以在IBMC界面的“诊断-黑匣子”关闭黑匣子功能,然后重启设备解决也可以通过在操作系统侧安装IBMA软件解决2288Hv5服务器安装Windows系统后,PCI数据捕获和信号处理控制器 出现感......
  • Linux系统驱动之编程_配置LCD控制器_基于IMX6ULL
    资料下载coding无法使用浏览器打开,必须用git工具下载:gitclonehttps://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git视频观看百问网驱动大全编程_配置LCD控制器_基于IMX6ULL参考资料,GIT仓库里:芯片资料IMX6ULL\开发板配套资料\datasheet\Core_board\CPU\IMX6ULL......
  • 08_调试与使用虚拟的GPIO控制器
    目录资料下载视频观看调试与使用虚拟的GPIO控制器1.硬件功能2.编写设备树文件3.上机实验3.2编译、替换设备树3.3编译、安装驱动程序4.STM32MP157上的bug资料下载coding无法使用浏览器打开,必须用git工具下载:gitclonehttps://e.coding.net/weidongshan/linux/doc_and_sourc......
  • 创建域控制器
    1.打开服务器管理器,点击添加角色和功能:2.默认,点击下一页: 3.勾选ActiveDirectory,点击下一页: 4.默认,点击下一页,点击安装: 5.等待安装完成,点击关闭:6.完成后回到服务器管理器界面,点击通知--将此服务器提升为域控制器:7.选择添加新林,填入自定义的根域名: 8.填入DS......
  • Ryu控制器教程
    RYU不要使用apt的方法安装,这样的安装是不完整的,并且相关文件不易查找。1.下载ryu源码cdcdDesktopgitclonehttps://gitee.com/lpm-123/ryu2.安装RYU环境安装PIPcdryupipinstall-rpip-requirements.txt-ihttps://pypi.tuna.tsinghua.edu.cn/simple安装依......
  • linux7 防火墙,firewall的说明及相关配置注释
    1、linux7防火墙,firewall的说明及相关配置注释防火墙RedhatEnterpriseLinux7已经默认使用firewalld作为防火墙,其使用方式已经变化。基于iptables的防火墙被默认不启动,但仍然可以继续使用。RHEL7中有几种防火墙共存:firewalld、iptables、ebtables等,默认使用firewalld作为防火墙,管......
  • 【后端】SSM框架下REST风格代码注释详解
    前言最近学习了一下SSM,不得不说,spring不用注解真的是天打雷劈,就那个bean真的就是折磨人。下面是我总结的spring注解。@Value此注解可以用来获取导入的jdbc.properties文件的值。@Value("${jdbc.driver}")privateStringdriver;//用法是这样的12jdbc.properties文件:jdbc.driv......