Как пометить свойство как требуется в Swagger, без проверки модели ASP.NET? - PullRequest
0 голосов
/ 15 ноября 2018

Я создаю общедоступный API, который использует несколько частных API (недоступен извне). Бизнес-валидации были написаны для частных API, и я не хочу переписывать их для публичного API. Но я хочу, чтобы документация по чванству была такой же.

Поэтому мне интересно, могу ли я пометить свойство как обязательное без использования атрибута Required в ASP.NET. Но что в документации о чванстве указано, что это обязательно. Это возможно?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Благодаря Мохсину я решил свою проблему.В следующем примере я создал атрибут SwaggerRequired.Этот атрибут можно разместить на любой модели.Затем AddSwaggerRequiredSchemaFilter обеспечивает изменение документации Swagger.Ниже приведен код, который я написал для этого

Случайная модель:

public class Foo
{
    [SwaggerRequired]
    public string FooBar{ get; set; }
}

Атрибут SwaggerRequiredAttribute:

[AttributeUsage(AttributeTargets.Property)] 
public class SwaggerRequiredAttribute : Attribute
{
}

И фильтр AddSwaggerRequiredSchemaFilter для его работы:

public class AddSwaggerRequiredSchemaFilter : ISchemaFilter
{
    public void Apply(Swashbuckle.Swagger.Schema schema, SchemaRegistry schemaRegistry, Type type)
    {
        PropertyInfo[] properties = type.GetProperties();
        foreach (PropertyInfo property in properties)
        {
            var attribute = property.GetCustomAttribute(typeof(SwaggerRequiredAttribute));

            if (attribute != null)
            {
                var propertyNameInCamelCasing = char.ToLowerInvariant(property.Name[0]) + property.Name.Substring(1);

                if (schema.required == null)
                {
                    schema.required = new List<string>()
                    {
                        propertyNameInCamelCasing
                    };
                }
                else
                {
                    schema.required.Add(propertyNameInCamelCasing);
                }
            }
        }
    }
}
0 голосов
/ 15 ноября 2018

Да, это возможно. Добавьте свой пользовательский класс, реализующий IOperationFilter

public class UpdateParametersAsRequired : IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry s, ApiDescription a)
    {
        if (operation.OperationId == "ControllerName_Action")
        {
            if (operation.Parameters != null)
            {
                foreach (var parameter in operation.Parameters)
                {
                    if (parameter.Name == "ParameterYouWantToEdit")
                    { 
                        // You can edit the properties here
                        parameter.Required = true;
                    }
                }
            }
            else
            {
              // Add parameters if doesn't exists any
                operation.Parameters = new List<IParameter>();
                operation.Parameters.Add(
                    new Parameter
                    {
                        name = "ParameterName",
                        @in = "body",
                        @default = "123",
                        type = "string",
                        description = "x y z",
                        required = true
                    }
                );
            }
        }
    }
}

Ура! * * 1004

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...