Элегантный способ использования нескольких SwaggerResponses - PullRequest
0 голосов
/ 07 декабря 2018

Я собираюсь использовать эти атрибуты на моем контроллере:

    [SwaggerResponse((int)HttpStatusCode.OK, typeof(GetAutotopupConfigurationResponse))]
    [SwaggerResponse((int)HttpStatusCode.BadRequest, typeof(ErrorResponse), BadRequestMessage)]
    [SwaggerResponse((int)HttpStatusCode.Unauthorized, typeof(ErrorResponse), InvalidCredentiasMessage)]
    [SwaggerResponse((int)HttpStatusCode.Forbidden, typeof(ErrorResponse), UserNoRightsMessage)]
    [SwaggerResponse((int)HttpStatusCode.NotFound, typeof(ErrorResponse), AutopopupNotFoundMessage)]
    [SwaggerResponse((int)HttpStatusCode.InternalServerError, typeof(ErrorResponse), InternalServerErrorMessage)]

Как мне упростить логику и уменьшить количество кода или как-то сделать его более гибким?

1 Ответ

0 голосов
/ 07 декабря 2018

РЕДАКТИРОВАТЬ Этот ответ относится к Asp.Net-Core, но может быть полезным и для этого вопроса.

Если вы используете Swashbuckle, вы можете использовать IOperationFilter и Reflection toцелевые конкретные конечные точки и программно применять ответы.

Можно использовать IOperationFilter, чтобы применить InternalServerError ко всем конечным точкам в вашем сервисе.Ниже приведен пример:

public class ServerErrorResponseOperationFilter : IOperationFilter
    {            
        // Applies the specified operation. Adds 500 ServerError to Swagger documentation for all endpoints            
        public void Apply(Operation operation, OperationFilterContext context)
        {
            // ensure we are filtering on controllers
            if (context.MethodInfo.DeclaringType.BaseType.BaseType == typeof(ControllerBase)
                || context.MethodInfo.ReflectedType.BaseType == typeof(Controller))
            {
                operation.Responses.Add("500", new Response { Description = "Server Error" });
            }                        
        }
    }

Вам необходимо настроить Swagger для использования этих фильтров.Вы можете сделать это, добавив в настройку:

services.AddSwaggerGen(swag =>
            {
                swag.SwaggerDoc("v1", new Info { Title = "Docs", Version = "v1" });

                // add swagger filters to document default responses
                swag.OperationFilter<ServerErrorResponseOperationFilter>();
            });

Вы можете использовать другие фильтры для применения 401 Несанкционированный, 403 Запрещенный и т. Д. Вы можете даже использовать Отражение, чтобы добавить 201 Создан для действий, отмеченных [HttpPost]и вы могли бы сделать нечто подобное для других атрибутов Http.

Если у вас есть фильтры для 401, 403 и 500, которые немного приведут в порядок ваш контроллер.Вам все равно нужно будет добавить атрибуты для определенных методов, которые не могут быть обработаны с помощью Reflection.С помощью этого метода, я считаю, мне нужно добавить только один или 2 атрибута, обычно [ProcudesResponseType((int)HttpStatusCode.BadRequest)] и [ProcudesResponseType((int)HttpStatusCode.NotFound)].

...