asp.net web api - net - Ejemplo de modelo predeterminado en Swashbuckle(Swagger)
swagger web api (4)
Estoy ejecutando ASP WebAPI 2 e instalé con éxito Swashbuckle. Estoy tratando de averiguar cómo uno define cuáles son los valores predeterminados del esquema.
Por ejemplo, en el sitio de demostración en vivo de Swagger cambiaron el valor predeterminado de la mascota por "perrito". También definieron los valores permitidos para el estado. ( Demostración en vivo )
Logré hacer que esto funcionara siguiendo lo que está en este enlace:
https://github.com/domaindrivendev/Swashbuckle/issues/69#issuecomment-53953785
En resumen, esto es lo que se necesita hacer:
Cree las clases SwaggerDefaultValue y AddDefaultValues como se describe en el enlace. Algunos cambios que hice:
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); param.@default = 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; } }
Edite su SwaggerConfig y agregue la clase AddDefaultValues a OperationFilters:
GlobalConfiguration.Configuration .EnableSwagger(c => { ... c.OperationFilter<AddDefaultValues>() ... });
Ahora, para los parámetros quiero valores predeterminados, solo agrego lo siguiente:
public IHttpActionResult Put([FromBody]Pet pet) { ... return Ok(); } public class Pet { [SwaggerDefaultValue("doggie")] public string Name { get; set; } [SwaggerDefaultValue("available")] public string Status; ... }
Bueno, el código de vgaspar.trivix no funcionó completamente para mí, los valores predeterminados no se establecieron para el esquema. También recibí una NullPointerException
. Me las arreglé para que funcionara según lo previsto al editar el método Apply
y manipulé el esquema de registro de esta manera:
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 && param.schema.@ref != null)
{
string schemaName = [email protected](''/'').LastOrDefault();
if (schemaRegistry.Definitions.ContainsKey(schemaName))
foreach (var props in schemaRegistry.Definitions[schemaName].properties)
{
if (parameterValuePairs.ContainsKey(props.Key))
props.Value.@default = parameterValuePairs[props.Key];
}
}
var parameterValuePair = parameterValuePairs.FirstOrDefault(p => p.Key.IndexOf(param.name, StringComparison.InvariantCultureIgnoreCase) >= 0);
param.@default = parameterValuePair.Value;
}
}
Un ejemplo de esquema de modelo se puede definir implementando ISchemaFilter
y registrándolo usando lo siguiente:
httpConfig
.EnableSwagger(c =>
{
c.SchemaFilter<AddSchemaExamples>()
});
Aquí se proporciona una implementación de ejemplo:
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
};
}
}
}
Fuente: https://github.com/domaindrivendev/Swashbuckle/issues/162
Sé que este hilo es bastante antiguo, pero quería compartir mi solución que crea un constructor personalizado solo para el esquema de ejemplo de Swagger.
En mi modelo:
/// <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 { }
En SwaggerConfig.cs:
c.SchemaFilter<ApplySchemaVendorExtensions>();
La extensión del esquema:
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() });
}
}
}
Uso:
[SwaggerConstructor]
public MyClass(System.Reflection.ParameterInfo[] decoy) : base()
{
MyProperty = false;
}