- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
非常喜欢. NET 的 /// 注释,写代码的时候就顺道完成写文档的过程,简直不要太爽了。 ASP. NET CORE 也是一样的,通过 Swagger 工具,可以自动生成 API 的接口文档(OpenAPI 规范 ),提供给前端使用,也可以用过 APIPOST/APIFOX 之类的工具提供给前端同学直接调用.
只需要安装 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)
{
}
}
在使用 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 方法的一起使用.
在 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].
这么看应该是通过 swagger 生成的 tag 与通过 [Tags] 注解生成的 tag 对象不能匹配,导致 swagger 生成的没用被引用.
查了很久资料,说这个是一个现在的 Bug ,有人通过重写 DisplayName,在帖子中给了临时的 解决方案 :
/// <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;
}
}
}
}
services.AddControllers(o =>
{
o.Conventions.Add(new ControllerDocumentationConvention());
});
[DisplayName("targetNames")]
即可。可以看到名称与注释都得到的保留,最终效果如下:
导入 APIFOX 也可以正常识别了.
最后此篇关于为控制器生成OpenAPI注释的文章就讲到这里了,如果你想了解更多关于为控制器生成OpenAPI注释的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
本文实例讲述了YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用。分享给大家供大家参考,具体如下: 在使用YII2中自带的RBAC时,需要先配置config/web.php:
添加路由 复制代码 代码如下: Route::get('artiles', 'ArticlesController@index'); 创建控制器
目录 一.系统环境 二.前言 三.StatefulSet简介 四.有状态应用和无状态应用区别 五.St
目录 一.系统环境 二.前言 三.Kubernetes 控制器 四.Deployment概览 五.创建
目录 一.系统环境 二.前言 三.DaemonSet 概览 四.创建DaemonSet 4
目录 一.系统环境 二.前言 三.ReplicationController概览 四.ReplicationCont
目录 一.系统环境 二.前言 三.ReplicaSet概览 四.ReplicaSet工作原理 五.Re
使用Yii2的时候,在某些场景和环境下需要获得Yii2目前所处于的module(模型)、Controller(控制器)、Action(方法),以及会调用控制器里面已经定义过的一些公共的方法等.对于这
我是一名优秀的程序员,十分优秀!