Общие коды ответов Swashbuckle

Есть ли способ определить "общие" коды ответов, которые применимы для всех вызовов.

Например, все вызовы могут возвращать одно из следующего:

400 - Bad request
500 - Internal server error (unknown exception occurred)
503 - Service unavailable (maintenance mode)

Вместо того, чтобы вставлять комментарии и атрибуты в каждую конечную точку, было бы хорошо, если бы я мог определить это в каком-то центральном месте.

1 ответ

Решение

Спасибо @HelderSepu действительно IDocumentFilter является решением

// Swagger config
swagger.DocumentFilter<DefaultFilter>();

internal class DefaultFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
    {
        foreach (var item in swaggerDoc.Paths.Values)
        {
            UpdateItem(item, "400", "Bad or malformed request.");
            UpdateItem(item, "500", "Internal server error.");
            UpdateItem(item, "503", "Service in maintenance mode.");
        }
    }

    private static void UpdateItem(PathItem item, string key, string description)
    {
        TrySetValue(item.Get, key, description);
        TrySetValue(item.Put, key, description);
    }

    private static void TrySetValue(Operation op, string key, string description)
    {
        if ( (op == null) || (op.Responses.ContainsKey(key)) )
        {
            return;
        }

        op.Responses.Add(key, new Response
        {
            Description = description,
        });
    }
}

Для тех, кто использует Swashbuckle 5

//in AddSwaggerGen
c.OperationFilter<GeneralExceptionOperationFilter>();
internal class GeneralExceptionOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        operation.Responses.Add("401", new OpenApiResponse() { Description = "Unauthorized" });
        operation.Responses.Add("403", new OpenApiResponse() { Description = "Forbidden" });

        //Example where we filter on specific HttpMethod and define the return model
        var method = context.MethodInfo.GetCustomAttributes(true)
            .OfType<HttpMethodAttribute>()
            .Single();

        if (method is HttpDeleteAttribute || method is HttpPostAttribute || method is HttpPatchAttribute || method is HttpPutAttribute)
        {
            operation.Responses.Add("409", new OpenApiResponse()
            {
                Description = "Conflict",
                Content = new Dictionary<string, OpenApiMediaType>()
                {
                    ["application/json"] = new OpenApiMediaType
                    {
                        Schema = context.SchemaGenerator.GenerateSchema(typeof(string), context.SchemaRepository)
                    }
                }
            });
        }
    }
}
Другие вопросы по тегам