Привязка параметров без учета регистра в минимальной документации по 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
но в этом сенаро вам понадобится фильтр для замены схемы категорий (если вам нужно, я доставлю его вам завтра)