Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to define default values for parameters for the Swagger UI?

I have Swagger/Swashbuckle integrated into a .NET Core 2.2 API project. Everything works great and what I am asking is purely for convenience. Consider the following API method:

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

When I hit /swagger/index.html and want to try out this API, I always have to enter the StreetAddress and Zip values.

Is there a way to provide default values for StreetAddress and Zip? This answer suggested placing [DefaultValue("value here")] attribute each property of the SomeRequest class. It may have worked for the regular .NET, but not with .NET Core.

Is it possible to provide default values for parameters for the Swagger UI?

like image 522
AngryHacker Avatar asked Nov 27 '22 06:11

AngryHacker


2 Answers

To define default values for parameters for Swagger UI in .NET Core, the following article defines a custom schema filter for your DefaultValue attribute in your Model class. The code shown below has been taken from this article and is purely to inform anyone else who has this question or has been facing a similar problem:

Decorate the desired properties in a model:

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

Main filter:

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);
        }
    }
}

And finally registering it to your Swagger Options(In Startup.cs):

services.AddSwaggerGen(c => {
    // ...
    c.SchemaFilter<SchemaFilter>();
});
like image 146
Rahul Sharma Avatar answered Dec 05 '22 09:12

Rahul Sharma


The initial credit goes to Rahul Sharma, though if someone is interested in .NET Core 3.0+, Swashbuckle v5.0.0-rc4 makes the SchemaFilter definition much simpler. Maybe there's a way to add example value with a new attribute or something like that, but I haven't found such a way.

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;
            }
        }
    }
}
like image 35
Max Shnurenok Avatar answered Dec 05 '22 10:12

Max Shnurenok