Tokiota Blog

Sacando provecho de Swagger - parte 3

Antonio Cárdenas García

Ya tenemos el tercer post de la serie, ya hemos visto comentarios XML y los ISchemaFilter. Hoy veremos content-type y headers.

Recordamos que tenemos una API en asp.net core 3.1 y con la versión de Swashbuckle.AspNetCore 5.0.0.

Fijar content type application/json

Si nuestra API solo va a aceptar y devolver contenido de tipo json, es recomendar fijar estos parámetros. Para ello utilizamos los atributos ‘Consumes’ y ‘Produces’ de Microsoft.AspNetCore.Mvc.

  
    /// 
    /// Get example info.
    /// 
    /// Example id.</param>
    /// Request example</param>
    /// 
    [HttpPatch("/example/{id}")]
    [Consumes("application/json")]
    [Produces("application/json")]
    public ActionResult< ExampleResponse > GetExample(int id, [FromBody] ExampleRequest request) 
    => Ok(new ExampleResponse());

En este caso se han aplicado a nivel de método como caso de prueba, sería más habitual aplicarlos a toda la API.

Añadir Headers personalizados

En ocasiones tenemos que construir una API que tiene que contar con un header propio, en este caso hemos utilizado un IOperationFilter y lo aplicamos a todos los endpoints.

  
public class CustomHeaderFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        if (operation.Parameters == null)
            operation.Parameters = new List< OpenApiParameter >();

        operation.Parameters.Add(new OpenApiParameter
        {
            Name = "x-header",
            In = ParameterLocation.Header,
            Description = "Custom header for our application.",
            Required = true,
            Schema = new OpenApiSchema
            {
                Type = "string",
                Example = new OpenApiString(CustomHeader.Xyz.ToString()),
                Enum = Enum
                    .GetValues(typeof(CustomHeader))
                    .Cast< CustomHeader >()
                        .Select(x => OpenApiAnyFactory.CreateFor(new OpenApiSchema() { Type = "string" }, x.ToString()))
                        .ToList()
            }
        });
    }
}

Para guardar los valores del CustomHeader se ha utilizado un enum:

  
public enum CustomHeader
{
    Xyz,
    Abc
}

Y ya que tenemos un Enum, podemos ajustar NewtonsoftJson para serializar los enums como string. Para ello desde el Startup, en el método ConfigureServices podemos añadir:

  
services
    .AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.Converters.Add(new StringEnumConverter());
    });

Una vez creado el IOperationFilter, igual que el resto de filtros de swagger, es necesario registraro como hemos hecho con el filtro anterior:

  
services.AddSwaggerGen(c =>
{
    //[...]

    c.OperationFilter< CustomHeaderFilter >();

    //[...]
});

De esta forma, cuando swagger se encuentre el enum de CustomHeader nos facilitará un desplegable con los distintos valores:

Muchas gracias. Nos leemos en más artículos.

Antonio Cárdenas García
Escrito por:

Antonio Cárdenas García

Development & Cloud Consultant

Compartelo por: