用于api操作参数的Swashbuckle SchemaFilter

问题描述 投票:1回答:2

我已成功创建qazxsw poi以扩展swagger.json枚举属性定义以用于代码生成目的,如qazxsw poi所述。这是我目前的ISchemaFilter方法:

here

SchemaFilter.Apply适用于我的模型定义,其中模型类具有枚举类型的成员。下面是输出示例:public void Apply(Schema schema, SchemaFilterContext context) { if (context.SystemType.IsEnum) { var names = Enum.GetNames(context.SystemType); var values = Enum.GetValues(context.SystemType); var desc = ""; foreach (var value in values) { var intValue = Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType())); desc += $"{intValue}={value},"; } desc = desc.TrimEnd(','); schema.Extensions.Add("x-enumNames", names); schema.Extensions["description"] = desc; } } -field,它是枚举类型,通知自定义SchemaFilter和修改后的resolution字段:

x-enumNames

问题是description不扩展运算参数中的枚举类型。例如,api-method后面有参数resolution: { format: "int32", enum: [ 1, 2, 3, 4 ], type: "integer", x-enumNames: [ "Hour", "Day", "Month", "Year" ], description: "1=Hour,2=Day,3=Month,4=Year" }

SchemaFilter

这会产生以下操作参数定义到swagger.json(注意缺少resolution):

public async Task<ActionResult<ReturnType>> GetData(Models.ResolutionEnum resolution)

有没有办法扩展作为方法参数一部分的swagger枚举模式?

c# asp.net-core enums swagger swashbuckle
2个回答
1
投票

尝试使用IDocumentFilter,我已经使用它注入x-EnumNames,这是一个示例:

{
    name: "resolution",
    in: "query",
    required: true,
    type: "integer",
    format: "int32",
    enum: [
        1,
        2,
        3,
        4
    ]
}

问题是你需要知道高级路径,不确定你的代码中是否有一个模式可以识别那些枚举...


1
投票

感谢x-stuff在这个问题下,我发现public class InjectXStuff : IDocumentFilter { public void Apply(SwaggerDocument s, DocumentFilterContext c) { PathItem path = s.Paths.Where(x => x.Key.Contains("Values")).First().Value; path.Post.Parameters.FirstOrDefault().Extensions.Add("x-stuff", "123456"); } } 命名空间中有多个扩展点。 another answer正是我想要的,我能够将Swashbuckle.AspNetCore.SwaggerGen注入方法参数定义。

以下是我制作的参数过滤器:

IParameterFilter

与其他过滤器一样,这可以在x-enumNames中使用以下代码段激活:

public class ModifyParametersFilter : IParameterFilter
{
    public void Apply(IParameter parameter, ParameterFilterContext context)
    {
        var type = context.ParameterInfo?.ParameterType;
        if (type == null)
            return;
        if (type.IsEnum)
        {
            var names = Enum.GetNames(type);
            var values = Enum.GetValues(type);
            var desc = "";

            foreach (var value in values)
            {
                var intValue = Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType()));
                desc += $"{intValue}={value},";
            }
            desc = desc.TrimEnd(',');
            if (!parameter.Extensions.ContainsKey("x-enumNames"))
                parameter.Extensions.Add("x-enumNames", names);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.