Dear community,
I try to create an web api endpoint that returns an image in a format that can be defined in the 'Accept-Header' field of the request. I'm using Swashbuckle NugGet Package (Swashbuckle.AspNetCore, Version 6.5.0) and the UI shows the parameter correctly: see
Swashbuckle Screenshot.
As you can see there too, the
curl parameter -H 'accept: text/plain' is wrong and should be 'image/jpeg'.
The openAPI definition is specified with an
IOperationFilter
that removes Action parameter of a certain type and inserts the Header parameter instead (see code below).
I've no glue what I am doing wrong ...
Thank you for any hint, advice and maybe solution!
Arne
What I have tried:
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using PEAM.API.Model;
using Swashbuckle.AspNetCore.SwaggerGen;
namespace PEAM.API.Middleware.Filter.OpenAPI
{
public sealed class EaImageFormatFilter
: IOperationFilter
{
private const string PngMimeType = "image/png";
private const string JpgMimeType = "image/jpeg";
private const string BmpMimeType = "image/bmp";
private const string OpenApiStringType = "string";
private const string AcceptHeader = "Accept";
private IList<IOpenApiAny> AcceptedImageTypes { get; }
public EaImageFormatFilter()
{
AcceptedImageTypes = new List<IOpenApiAny>()
{
new OpenApiString(PngMimeType),
new OpenApiString(JpgMimeType),
new OpenApiString(BmpMimeType)
};
}
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
var parameterType = typeof(EaImageFormat);
var parameterToRemove = context.ApiDescription.ParameterDescriptions
.Where(parameter => parameter.Type.Equals(parameterType))
.Select(parameter => parameter.Name)
.ToHashSet();
if (parameterToRemove.Any())
{
var keepParameter = (OpenApiParameter p) => !parameterToRemove.Contains(p.Name);
operation.Parameters = operation.Parameters
.Where(keepParameter)
.ToList();
var parameter = new OpenApiParameter
{
In = ParameterLocation.Header,
Name = AcceptHeader,
Description = "Pass accepted image format, e.g.: image/png, image/jpeg",
Required = false,
Schema = new OpenApiSchema
{
Type = OpenApiStringType,
Default = new OpenApiString(PngMimeType),
Enum = AcceptedImageTypes
},
};
operation.Parameters.Add(parameter);
}
}
}
}