Привязка параметров без учета регистра в минимальной документации по API и Swagger

У меня есть минимальный API ac# .net 8, который принимает в качестве параметра перечисление:

      app.MapGet("/{id}/attachments/{category}/{attachmentId}", async (
            Guid id,
            AttachmentCategory category,
            string attachmentId) => {
                ...
            })

Перечисление:

      public enum AttachmentCategory
{
    Documents,
    Photos
}

Я используюSystem.Text.Json

Сериализация:

      options.SerializerOptions.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase));

работает:

      https://localhost:1234/api/v1/item/b9c10df0-c974-4876-a3fa-d4b5e8140929/attachments/Documents/3abd9b3b-97e9-4668-b4b3-50cbcdac0220.pdf

не работает:

      https://localhost:1234/api/v1/item/b9c10df0-c974-4876-a3fa-d4b5e8140929/attachments/documents/3abd9b3b-97e9-4668-b4b3-50cbcdac0220.pdf

Могу ли я заставить работать нижний регистр? может быть, оба?

Проблема 2: параметр перечисления отображается в Swagger как строка, а не как перечисление.

ЭтоIDocumentFilterединственный способ это исправить?

1 ответ

Чтобы решить проблему 2, вы можете попробовать:

      builder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(options =>
{
    options.SerializerOptions.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter());
});
builder.Services.Configure<Microsoft.AspNetCore.Mvc.JsonOptions>(options =>
{
    options.JsonSerializerOptions.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter());
});

.....

      app.MapGet("/{id}/attachments/{category}/{attachmentId}", (
            Guid id,
            [FromRoute] AttachmentCategory category,
            string attachmentId) =>
{
    .....
})
.WithOpenApi();

Чтобы устранить проблему 1:

      app.MapGet("/{id}/attachments/{category}/{attachmentId}", (Guid id, [FromRoute]Category category, string attachmentId) =>
{
    return attachmentId;
})
.WithOpenApi();

public class Category
{
    [FromRoute]
    public AttachmentCategory category { get; set; }

    public static bool TryParse(string? value, IFormatProvider? provider,
                                out Category? categoryval)
    {

       
        
        var success= Enum.TryParse<AttachmentCategory>(value,
                                    ignoreCase: true, out var categoryenumval);
        if(success)
        {
            categoryval = new Category() { category = categoryenumval };
            return true;
        }
        else
        {
            categoryval = null;
            return false;
        }
        
    }
    
}

согласно этому документу , связанная проблема на github

но в этом сенаро вам понадобится фильтр для замены схемы категорий (если вам нужно, я доставлю его вам завтра)

Другие вопросы по тегам