Пример модели по умолчанию в Swashbuckle (Swagger)
Я запускаю ASP WebAPI 2 и успешно устанавливаю Swashbuckle. Я пытаюсь выяснить, как определить, что представляют собой значения схемы по умолчанию?
Например, на демо-сайте Swagger live они изменили значение по умолчанию для домашнего животного на "doggie". Они также определили допустимые значения статуса. (Live Demo)
![Example 1]()
![Example 2]()
Ответы
Ответ 1
Ну, код vgaspar.trivix для меня не работал, значения по умолчанию не были установлены для схемы. Также я получил NullPointerException
. Мне удалось заставить его работать по назначению, отредактировав метод Apply
и обработав schemaRegistry следующим образом:
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
if (operation.parameters == null)
return;
IDictionary<string, object> parameterValuePairs =
GetParameterValuePairs(apiDescription.ActionDescriptor);
foreach (var param in operation.parameters)
{
if (param.schema != null && [email protected] != null)
{
string schemaName = [email protected]('/').LastOrDefault();
if (schemaRegistry.Definitions.ContainsKey(schemaName))
foreach (var props in schemaRegistry.Definitions[schemaName].properties)
{
if (parameterValuePairs.ContainsKey(props.Key))
[email protected] = parameterValuePairs[props.Key];
}
}
var parameterValuePair = parameterValuePairs.FirstOrDefault(p => p.Key.IndexOf(param.name, StringComparison.InvariantCultureIgnoreCase) >= 0);
[email protected] = parameterValuePair.Value;
}
}
Ответ 2
Мне удалось получить эту работу, выполнив следующую ссылку:
https://github.com/domaindrivendev/Swashbuckle/issues/69#issuecomment-53953785
Короче говоря, это то, что нужно сделать:
-
Создайте классы SwaggerDefaultValue и AddDefaultValues, как описано в ссылке. Некоторые изменения, которые я сделал:
public class SwaggerDefaultValue : Attribute
{
public string Name { get; set; }
public string Value { get; set; }
public SwaggerDefaultValue(string value)
{
this.Value = value;
}
public SwaggerDefaultValue(string name, string value) : this(value)
{
this.Name = name;
}
}
public class AddDefaultValues : IOperationFilter
{
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
IDictionary<string, object> parameterValuePairs =
GetParameterValuePairs(apiDescription.ActionDescriptor);
foreach (var param in operation.parameters)
{
var parameterValuePair = parameterValuePairs.FirstOrDefault(p => p.Key.IndexOf(param.name, StringComparison.InvariantCultureIgnoreCase) >= 0);
[email protected] = parameterValuePair.Value;
}
}
private IDictionary<string, object> GetParameterValuePairs(HttpActionDescriptor actionDescriptor)
{
IDictionary<string, object> parameterValuePairs = new Dictionary<string, object>();
foreach (SwaggerDefaultValue defaultValue in actionDescriptor.GetCustomAttributes<SwaggerDefaultValue>())
{
parameterValuePairs.Add(defaultValue.Name, defaultValue.Value);
}
foreach (var parameter in actionDescriptor.GetParameters())
{
if (!parameter.ParameterType.IsPrimitive)
{
foreach (PropertyInfo property in parameter.ParameterType.GetProperties())
{
var defaultValue = GetDefaultValue(property);
if (defaultValue != null)
{
parameterValuePairs.Add(property.Name, defaultValue);
}
}
}
}
return parameterValuePairs;
}
private static object GetDefaultValue(PropertyInfo property)
{
var customAttribute = property.GetCustomAttributes<SwaggerDefaultValue>().FirstOrDefault();
if (customAttribute != null)
{
return customAttribute.Value;
}
return null;
}
}
-
Отредактируйте SwaggerConfig и добавьте класс AddDefaultValues в OperationFilters:
GlobalConfiguration.Configuration
.EnableSwagger(c => {
...
c.OperationFilter<AddDefaultValues>()
...
});
-
Теперь для параметров я хочу значения по умолчанию, я просто добавляю следующее:
public IHttpActionResult Put([FromBody]Pet pet)
{
...
return Ok();
}
public class Pet {
[SwaggerDefaultValue("doggie")]
public string Name { get; set; }
[SwaggerDefaultValue("available")]
public string Status;
...
}
Ответ 3
Пример схемы модели можно определить, выполнив ISchemaFilter
и зарегистрировав его, используя следующее:
httpConfig
.EnableSwagger(c =>
{
c.SchemaFilter<AddSchemaExamples>()
});
Ниже приведен пример реализации:
public class AddSchemaExamples : ISchemaFilter
{
public void Apply(Schema schema, SchemaRegistry schemaRegistry, Type type)
{
if (type == typeof(Product))
{
schema.example = new Product
{
Id = 123,
Type = ProductType.Book,
Description = "Treasure Island",
UnitPrice = 10.0M
};
}
}
}
Источник: https://github.com/domaindrivendev/Swashbuckle/issues/162
Ответ 4
Я знаю, что этот поток довольно старый, но я хотел бы поделиться своим решением, которое создает пользовательский конструктор только для схемы примера Swagger.
В моей модели:
/// <summary>
/// Supply a custom constructor for Swagger where you can apply defaults to control the example schema.
/// The constructor must have one parameter of type System.Reflection.ParameterInfo[].
/// Note: Setting a property to null will prevent it from showing in the Swagger example.
/// </summary>System.Reflection.ParameterInfo[].
/// </summary>
public class SwaggerConstructor : Attribute { }
В SwaggerConfig.cs:
c.SchemaFilter<ApplySchemaVendorExtensions>();
Расширение схемы:
public class ApplySchemaVendorExtensions : ISchemaFilter
{
public void Apply(Schema schema, SchemaRegistry schemaRegistry, Type type)
{
ConstructorInfo constructor = type.GetConstructors().FirstOrDefault(c => c.GetCustomAttribute<SwaggerConstructor>() != null);
if (constructor != null)
{
schema.example = constructor.Invoke(new object[] { constructor.GetParameters() });
}
}
}
Использование:
[SwaggerConstructor]
public MyClass(System.Reflection.ParameterInfo[] decoy) : base()
{
MyProperty = false;
}
Ответ 5
Наткнулся на это только сейчас, вы также можете установить тег в документации XML, в одной из моих моделей, я определил это
/// <summary>
/// Note content
/// </summary>
/// <example>Any text for a note.</example>
public string Note { get; set; }
который в конечном итоге выглядит так в документации по чванству при выборе "Попробуй сейчас"
![enter image description here]()
Надеюсь, что это помогает кому-то!