我需要使用某些条件在Swagger UI的响应的 Model |示例值中隐藏或显示模型的某些属性。
这怎么可能实现?我的条件基于api操作的属性和DTO的属性。因此,例如,如果一个动作提供了一个属性,那么我们应该只能在Swagger UI中看到标记的属性。
答案 0 :(得分:0)
已解决。您只需要实现IOperationFilter
并进行注册。这些东西使您可以显示同一模型的定制不同示例。
DTO
public class MyDTO
{
public int Id { get; set; }
[ShortModelMember]
public string Name { get; set; }
...
}
API控制器中的方法
[HttpGet]
[ReturnShortModel]
public MyDTO GetSmthg()
{
return MyDTO.GetExample();
}
Swagger的自定义操作过滤器
public class SwaggerExcludeFilter : IOperationFilter
{
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
if (!apiDescription.GetControllerAndActionAttributes<ReturnShortModelAttribute>().Any())
{
return;
}
var responseType = apiDescription.ResponseDescription.DeclaredType;
var description = $"OK (uses a short model of {responseType})";
var props = responseType
.GetProperties()
.Where(p => p.GetCustomAttributes(typeof(ShortModelMemberAttribute)).Any())
.ToDictionary(p => p.Name, p.PropertyType.Name);
}
operation.responses.Clear();
operation.responses.Add("200", new Response
{
description = description,
schema = new Schema
{
example = props,
},
});
}
}
最后
c.OperationFilter<SwaggerExcludeFilter>();