wake-up-neo.net

Standardmodellbeispiel in Swashbuckle (Swagger)

Ich verwende ASP WebAPI 2 und habe Swashbuckle erfolgreich installiert. Ich versuche herauszufinden, wie die Standardschemawerte definiert werden.

Auf der Swagger-Live-Demo-Site wurde beispielsweise der Standardwert von pet in "doggie" geändert. Sie haben auch die zulässigen Werte für den Status definiert. ( Live Demo )

Example 1Example 2

15
ElPresidente

Nun, der Code von vgaspar.trivix hat für mich nicht vollständig funktioniert, die Standardwerte wurden nicht für das Schema festgelegt. Ich habe auch eine NullPointerException. Ich habe es mit der Apply-Methode wie gewünscht zum Laufen gebracht und die schemaRegistry wie folgt bearbeitet:

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

Ich habe es geschafft, dies zu erreichen, indem ich folgte, was auf diesem Link steht:

https://github.com/domaindrivendev/Swashbuckle/issues/69#issuecomment-53953785

Kurz gesagt, das ist, was getan werden muss:

  1. Erstellen Sie die Klassen SwaggerDefaultValue und AddDefaultValues ​​wie im Link beschrieben. Einige Änderungen, die ich gemacht habe:

    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;
        }
    }
    
    1. Bearbeiten Sie Ihre SwaggerConfig und fügen Sie den OperationFilters die AddDefaultValues-Klasse hinzu:

      GlobalConfiguration.Configuration
          .EnableSwagger(c => {
                ...
                c.OperationFilter<AddDefaultValues>()
                ...
           });
      
    2. Nun füge ich für die Parameter, die ich als Standardwerte verwenden möchte, Folgendes hinzu:

      public IHttpActionResult Put([FromBody]Pet pet)
      {
         ...
         return Ok();
      }
      
      public class Pet {
          [SwaggerDefaultValue("doggie")]
          public string Name { get; set; }
      
          [SwaggerDefaultValue("available")]
          public string Status;
      
          ...
      }
      
12
vgaspar.travix

Ein Beispielmodellschema kann definiert werden, indem Sie ISchemaFilter implementieren und es wie folgt registrieren:

httpConfig 
    .EnableSwagger(c =>
         {
             c.SchemaFilter<AddSchemaExamples>()
         });

Eine Beispielimplementierung finden Sie hier:

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

Quelle: https://github.com/domaindrivendev/Swashbuckle/issues/162

7
Andy Hoyle

Stolperte über dies gerade, können Sie auch das Tag in der XML-Dokumentation festlegen, in einem meiner Modelle habe ich dies definiert

    /// <summary>
    /// Note content
    /// </summary>
    /// <example>Any text for a note.</example>
    public string Note { get; set; }

das sieht dann in der Dokumentation von swagger so aus, wenn Sie "Try It Now" auswählen.

enter image description here

Hoffe das hilft jemandem!

1
0909EM

Ich weiß, dass dieser Thread ziemlich alt ist, aber ich wollte meine Lösung freigeben, die einen benutzerdefinierten Konstruktor nur für das Swagger-Beispielschema erstellt.

In meinem Modell:

/// <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 { }

In SwaggerConfig.cs:

c.SchemaFilter<ApplySchemaVendorExtensions>();

Die Schemaerweiterung:

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

Verwendungszweck:

    [SwaggerConstructor]
    public MyClass(System.Reflection.ParameterInfo[] decoy) : base()
    {
        MyProperty = false;
    }
1
bmatchey