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.