非常喜欢. 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 的注释能够正常显示,但是对的控制器的注释不能正常被识别。

查看生成的 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 里面就可以看到注释了:

但是导入到 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 变得非常奇怪:

出现了两个不同的 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")] 即可。可以看到名称与注释都得到的保留,最终效果如下:

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

参考资料

为控制器生成OpenAPI注释的更多相关文章

  1. PowerDesigner15.1创建模型及生成带注释sql操作手册

    转自:http://blog.csdn.net/huiwenjie168/article/details/7824029 一.创建模型 操作:file-->new Model… 快捷键:ctrl ...

  2. T4 模板自动生成带注释的实体类文件

    T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll 生成实体就是这么简单,只要建一个T4文件和 文件夹里面放一个DLL. 使用T4模板教程 步骤1 创建T4模板 如果你没有 ...

  3. IDEA设置生成带注释的getter和setter解决方案 (图文教程)

    近日在研究重构代码的时候有用到idea的不少插件,比如CheckStyle,同时下载了阿里的开发规约,收到不少启发. 规约中会要求所有的方法都有Javadoc,但是通常我们用idea默认生成的gett ...

  4. Mybatis Generator的model生成中文注释,支持oracle和mysql(通过实现CommentGenerator接口的方法来实现)

    自己手动实现的前提,对maven项目有基本的了解,在本地成功搭建了maven环境,可以参考我之前的文章:maven环境搭建 项目里新建表时model,mapper以及mapper.xml基本都是用My ...

  5. 修改mybatis plus Generator模板生成字段注释枚举常量

    修改mybatis plus Generator模板生成字段注释枚举常量 本文基于最新的mybatis-plus 3.0.1版本源码修改,如果使用其它版本,处理方式也类似,主要是生成Entity的Fr ...

  6. idea生成类注释和方法注释的正确方法

    系统:Mac OS idea版本:2017.3.1 ---------------- 生成类注释 打开Preferences Editor -> File and Code Templates ...

  7. mybatis generator 生成中文注释

    mybatis generator默认生成 的注释太奇葩了,完全不能拿到生产去用,不过幸亏提供了接口可以自己扩展.长话短说,要生成如下的domain, package com.demo.domain; ...

  8. mybatis generator为实体类生成自定义注释(读取数据库字段的注释添加到实体类,不修改源码)

    我们都知道mybatis generator自动生成的注释没什么实际作用,而且还增加了代码量.如果能将注释从数据库中捞取到,不仅能很大程度上增加代码的可读性,而且减少了后期手动加注释的工作量. 1.首 ...

  9. IntelliJ IDEA / Eclipse 自动生成 Author 注释 签名

    Author 注释 签名如下: /*** @author 稚枭天卓 E-mail:zhxiaotianzhuo@163.com* @version 创建时间:2016-6-20 下午04:58:52* ...

  10. 如何生成带注释的DLL文件

    背景: 实际上并不是生成带有注释的DLL文件,而是同时生成一个XML文件,用来显示注释. 为什么要使用DLL文件,在C#编程的过程中,一直在使用DLL文件,如System.dll 方法: 1,创建类库 ...

随机推荐

  1. 四月二十七日java基础知识

    1.多线程的主要目的是讲一个程序中的各个"程序段"并发化2.并行执行通常表示为同一时刻有多个代码在处理器上执行3.并发执行通常表示为在单个处理器上,同一时刻只执行一个代码,但在一个 ...

  2. opengauss配置远程白名单

    DB_VERSION:openGauss 3.0.3 1.允许192.168网段用户使用jack用户登陆 --创建只读账号 CREATE USER jack WITH MONADMIN passwor ...

  3. Spring @Profile注解使用和源码解析

    介绍 在之前的文章中,写了一篇使用Spring @Profile实现开发环境,测试环境,生产环境的切换,之前的文章是使用SpringBoot项目搭建,实现了不同环境数据源的切换,在我们实际开发中,会分 ...

  4. TIM-PWM输出,占空比改变时机对输出波形的影响

    一.实验概述 以下说明描述三种改变PWM占空比的方式,对于当前PWM输出波形的影响 1.禁止预装载功能,在PWM某一周期波形输出过程中改变占空比值(ccp) 2.禁止预装载功能,在PWM某周期波形输出 ...

  5. 快速上手Linux核心命令(五):文本处理三剑客

    @ 目录 前言 正则表达式 第一剑客 grep 第二剑客 sed 第三 剑客 awk 小结 剑仙镇楼~ O(∩_∩)O 前言 上一篇中已经预告,我们这篇主要说Linux文本处理三剑客.他们分别是gre ...

  6. FFmpeg开发笔记(二)搭建Windows系统的开发环境

    由于Linux系统比较专业,个人电脑很少安装Linux,反而大都安装Windows系统,因此提高了FFmpeg的学习门槛,毕竟在Windows系统搭建FFmpeg的开发环境还是比较麻烦的.不过若有已经 ...

  7. .NET周报 【4月第5期 2023-04-30】

    国内文章 基于 Github 平台的 .NET 开源项目模板. 嘎嘎实用! https://www.cnblogs.com/NMSLanX/p/17326728.html 大家好,为了使开源项目的维护 ...

  8. 音视频八股文(3)--ffmpeg常见命令(2)

    07-ffplay命令播放媒体 播放本地文件 播放本地 MP4 视频文件 test.mp4 的命令,从第 2 秒位置开始播放,播放时长为 10 秒,并且在窗口标题中显示 "test time ...

  9. 2023-03-14:读取摄像头,并且显示视频。代码用go语言编写。

    2023-03-14:读取摄像头,并且显示视频.代码用go语言编写. 答案2023-03-14: 大体流程如下: 导入所需的库和包. 初始化 ffmpeg 和 SDL2 库. 打开摄像头并创建 AVF ...

  10. 2021-11-08:扁平化嵌套列表迭代器。给你一个嵌套的整数列表 nestedList 。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化

    2021-11-08:扁平化嵌套列表迭代器.给你一个嵌套的整数列表 nestedList .每个元素要么是一个整数,要么是一个列表:该列表的元素也可能是整数或者是其他列表.请你实现一个迭代器将其扁平化 ...