ASP.NET Core WebAPI使用Swagger生成文档
介绍:
Swagger是为帮助我们生成webapi文档的工具
使用步骤:
添加Nuget:Swashbuckle.AspNetCore
添加服务:
public static class ServiceCollectionExtension
{
public static void AddSwagger(this IServiceCollection services)
{
//注册Swagger生成器
services.AddSwaggerGen(c =>
{
//定义一个或多个Swagger 文档
c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo()
{
Title = "v1 标题",
Version = "v1",
Description = "v1描述信息",
Contact = new Microsoft.OpenApi.Models.OpenApiContact
{
Name = "fan",
Email = "410577910@qq.com",
Url = new System.Uri("https://www.cnblogs.com/fanfan-90/")
},
License = new Microsoft.OpenApi.Models.OpenApiLicense
{
Name = "许可证名字",
Url = new System.Uri("https://www.cnblogs.com/fanfan-90/")
},
Extensions = new Dictionary {
{ "powered by", new Microsoft.OpenApi.Any.OpenApiString(".net5 in kubernetes v1.17") }
}
});
// 为 Swagger JSON and UI设置xml文档注释路径
var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);//获取应用程序所在目录(绝对,不受工作目录影响,建议采用此方法获取路径)
var xmlPath = Path.Combine(basePath, "SwaggerDemo.xml");
c.IncludeXmlComments(xmlPath);
// 开启支持在属性上添加注释,如:[SwaggerSchema("ID")],内容会显示在UI中
c.EnableAnnotations();
});
}
}
添加中间件:
public static class IApplicationBuilderExtension
{
public static void UseSwaggerMiddleWare(this IApplicationBuilder app)
{
//生成SwaggerJSON终结点
//http://localhost:/swagger/{DocName}/swagger.json。如:/swagger/webapi/swagger.json
app.UseSwagger();
//启用中间件服务对swagger-ui,指定Swagger JSON终结点
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "v1~~~");
c.RoutePrefix = string.Empty;//SwaggerUI界面默认url是/swagger/index.html;修改后可通过 /index.html 访问SwaggerUI
});
}
}
文档添加详细信息
修改终结点路径
UseSwagger():会生成终结点路由,通过/swagger/{DocName}/swagger.json可以访问
以下代码可修改默认的终结点路径,修改后的访问路径:(http://localhost:9005/api/swagger.json)(http://localhost:9005/webapi/swagger.json)
app.UseSwagger(options => { options.RouteTemplate = "/{documentName}/swagger.json"; options.SerializeAsV2 = true; });
文档排除指定接口
SwaggerUI中不显示指定接口,在需要排除的Controller或Action上添加特性:
[ApiExplorerSettings(IgnoreApi = true)]
为WebAPI分组
添加服务、中间件(v1、a1)
public static class ServiceCollectionExtension
{
public static void AddSwagger(this IServiceCollection services)
{
//注册Swagger生成器,定义一个和多个Swagger 文档
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo()
{
Title = "v1接口",
Version = "v1",
Description = "内部使用接口"
});
c.SwaggerDoc("a1", new Microsoft.OpenApi.Models.OpenApiInfo
{
Title = "a1接口",
Version = "a1",
Description = "外部使用接口"
});
// 为 Swagger JSON and UI设置xml文档注释路径
var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);//获取应用程序所在目录(绝对,不受工作目录影响,建议采用此方法获取路径)
var xmlPath = Path.Combine(basePath, "SwaggerDemo.xml");
c.IncludeXmlComments(xmlPath);
});
}
}
public static class IApplicationBuilderExtension
{
public static void UseSwaggerMiddleWare(this IApplicationBuilder app)
{
//启用中间件服务生成Swagger作为JSON终结点
app.UseSwagger();
//启用中间件服务对swagger-ui,指定Swagger JSON终结点
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "v1~~~");
c.SwaggerEndpoint("/swagger/a1/swagger.json", "a1~~~");
c.RoutePrefix = string.Empty;//SwaggerUI界面默认url是/swagger/index.html;修改后可通过 /index.html 访问SwaggerUI
});
}
}
添加两个Controller,分别属于v1、a1:
[ApiController]
[ApiExplorerSettings(GroupName = "v1")]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger _logger;
public WeatherForecastController(ILogger logger)
{
_logger = logger;
}
///
/// 获取天气
///
///
/// 例子:
/// /WeatherForecast
///
/// 返回天气
[HttpGet]
public IEnumerable Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
[ApiController]
[ApiExplorerSettings(GroupName = "a1")]
[Route("[controller]")]
public class OrderController : ControllerBase
{
///
/// 获取单个订单
///
///
/// 例子:
/// /order/1
///
///
///
[HttpGet("/order/{order_id}")]
public Order_master GetOne([FromRoute(Name = "order_id")]long orderID)
{
return new Order_master { ID = 1, Price = 10.1M };
}
}
public class Order_master
{
public long ID { get; set; }
public decimal Price { get; set; }
}
支持Newtonsoft:
使用Newtonsoft对接口参数序列化
添加Nuget包:
services.AddSwaggerGen(c =>
{
//省略....
}).AddSwaggerGenNewtonsoftSupport();//添加对Newtonsoft支持
SwaggerGenOptions参数类:
SwaggerDoc():配置接口描述信息
OperationFilter():可通过IOperationFilter接口去添加一些公共的参数
DocumentFilter通过IDocumentFilter接口去生成控制器的标签(描述)
参数类添加注释
添加Nuget包:
参数类添加注释:
public class OrderModel
{
[SwaggerSchema("订单主ID")]
public long ID { get; set; }
[SwaggerSchema("用户ID")]
public long UserID { get; set; }
}
ConfigureServices()方法中添加:
services.AddSwaggerGen(c =>
{
c.EnableAnnotations();
});
效果如下:
枚举属性显示属性名
效果如下:
services.AddSwaggerGen(c =>{
c.DescribeAllEnumsAsStrings();
}).AddSwaggerGenNewtonsoftSupport();
ReDoc UI
前面使用的是SWagger UI,还可以使用其他UI显示SWagger文档,比如:ReDoc UI
参考:
基础:
WebAPI分组:
KnifeUI: