【问题标题】:How to define default values for parameters for the Swagger UI?如何为 Swagger UI 定义参数的默认值?
【发布时间】:2019-07-29 19:04:03
【问题描述】:

我已将 Swagger/Swashbuckle 集成到 .NET Core 2.2 API 项目中。一切都很好,我所要求的纯粹是为了方便。考虑以下 API 方法:

public Model SomeEstimate(SomeRequest request) {
    return Manager.GetSomeEstimate(request);
}
...
public class SomeRequest {
    public string StreetAddress { get; set; }
    public string Zip { get; set; }
}

当我点击 /swagger/index.html 并想试用此 API 时,我总是必须输入 StreetAddress 和 Zip 值。

有没有办法为 StreetAddress 和 Zip 提供默认值? answer 建议将 [DefaultValue("value here")] 属性放置在 SomeRequest 类的每个属性中。它可能适用于常规 .NET,但不适用于 .NET Core。

是否可以为 Swagger UI 的参数提供默认值?

【问题讨论】:

标签: c# .net .net-core swagger swashbuckle


【解决方案1】:

为在 .NET Core 中为 Swagger UI 定义参数的默认值,以下article 为模型类中的 DefaultValue 属性定义了一个自定义架构过滤器。下面显示的代码取自这篇文章,纯粹是为了告知其他有此问题或遇到类似问题的人:

在模型中装饰所需的属性:

public class Test {
    [DefaultValue("Hello")]
    public string Text { get; set; }
}

主过滤器:

using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;

namespace Project.Swashbuckle {

    public class SchemaFilter : ISchemaFilter {

        public void Apply(Schema schema, SchemaFilterContext context) {
            if (schema.Properties == null) {
                return;
            }

            foreach (PropertyInfo propertyInfo in context.SystemType.GetProperties()) {

                // Look for class attributes that have been decorated with "[DefaultAttribute(...)]".
                DefaultValueAttribute defaultAttribute = propertyInfo
                    .GetCustomAttribute<DefaultValueAttribute>();

                if (defaultAttribute != null) {
                    foreach (KeyValuePair<string, Schema> property in schema.Properties) {

                        // Only assign default value to the proper element.
                        if (ToCamelCase(propertyInfo.Name) == property.Key) {
                            property.Value.Example = defaultAttribute.Value;
                            break;
                        }
                    }
                }
            }
        }

        private string ToCamelCase(string name) {
            return char.ToLowerInvariant(name[0]) + name.Substring(1);
        }
    }
}

最后将其注册到您的 Swagger 选项中(在 Startup.cs 中):

services.AddSwaggerGen(c => {
    // ...
    c.SchemaFilter<SchemaFilter>();
});

【讨论】:

【解决方案2】:

最初的功劳归于Rahul Sharma,但如果有人对 .NET Core 3.0+ 感兴趣,Swashbuckle v5.0.0-rc4 使 SchemaFilter 的定义更加简单。也许有一种方法可以使用新属性或类似的东西添加示例值,但我还没有找到这种方法。

public class SchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (schema.Properties == null)
        {
            return;
        }

        foreach (var property in schema.Properties)
        {
            if (property.Value.Default != null && property.Value.Example == null)
            {
                property.Value.Example = property.Value.Default;
            }
        }
    }
}

【讨论】:

    【解决方案3】:

    Swashbuckle.AspNetCore 5.6.3 只需要DefaultValueAttribute

    猜你喜欢
    • 1970-01-01
    • 2018-06-20
    • 2021-12-22
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2018-06-05
    相关资源
    最近更新 更多