Какие знаешь способы настройки маршрутизации в minimal APIs?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Способы настройки маршрутизации в Minimal APIs
В Minimal APIs, представленных в .NET 6 и развитых в последующих версиях, маршрутизация настраивается декларативно через методы расширения для WebApplication. Основные подходы включают:
1. Базовое сопоставление маршрутов через Map* методы
Каждый HTTP-метод имеет соответствующий метод расширения (MapGet, MapPost, MapPut и т.д.). Маршруты задаются строковыми шаблонами:
var app = WebApplication.Create(args);
app.MapGet("/products", () => "Список продуктов");
app.MapPost("/products", () => "Продукт создан");
app.MapGet("/products/{id:int}", (int id) => $"Продукт {id}");
2. Параметры маршрутов с ограничениями
Параметры могут включать ограничения типов прямо в шаблоне маршрута:
// Ограничения типа
app.MapGet("/users/{id:int}", (int id) => { });
app.MapGet("/books/{isbn:regex(^\\d{{3}}-\\d{{10}}$)}", (string isbn) => { });
// Необязательные параметры
app.MapGet("/search/{term?}", (string? term) => term ?? "Все");
3. Группировка маршрутов с MapGroup
Для организации связанных эндпоинтов и применения общих настроек:
var productGroup = app.MapGroup("/api/products")
.WithTags("Products")
.RequireAuthorization();
productGroup.MapGet("/", GetProducts);
productGroup.MapGet("/{id}", GetProductById);
productGroup.MapPost("/", CreateProduct);
4. Расширенная конфигурация через RouteGroupBuilder
Группы поддерживают цепочку методов для настройки:
app.MapGroup("/admin")
.WithTags("Admin")
.RequireAuthorization(policy => policy.RequireRole("Admin"))
.WithOpenApi()
.AddEndpointFilter<ValidationFilter>()
.MapGet("/users", GetAdminUsers);
5. Кастомизация через WithName и WithMetadata
Явное задание имени маршрута и метаданных:
app.MapGet("/health", () => Results.Ok())
.WithName("HealthCheck")
.WithMetadata(new TagsAttribute("Monitoring"));
6. Организация кода через разделение на модули
С использованием IEndpointRouteBuilder:
// В отдельном классе/методе
public static void ConfigureProductEndpoints(IEndpointRouteBuilder app)
{
app.MapGet("/api/products", GetProducts);
}
// В Program.cs
ConfigureProductEndpoints(app);
7. Использование MapMethods для нестандартных методов
Для HTTP-методов, не имеющих специализированных методов:
app.MapMethods("/custom", new[] { "PATCH", "CUSTOM" }, () => "Обработка");
8. Встраивание фильтров и валидации
Маршрутизация может включать EndpointFilter:
app.MapPost("/orders", (Order order) => { })
.AddEndpointFilter<ValidationFilter<Order>>();
9. Работа с путями через RoutePattern
Динамическое создание шаблонов:
var pattern = RoutePatternFactory.Parse("/api/{version}/{controller}");
app.MapGet(pattern, (string version, string controller) => { });
10. Кастомизация через EndpointRouteBuilderOptions
Глобальная настройка через ConfigureEndpointRouteBuilder:
builder.Services.Configure<RouteHandlerOptions>(options =>
{
options.ThrowOnBadRequest = true;
});
Ключевые особенности Minimal API маршрутизации
- Производительность: Отсутствие контроллеров снижает накладные расходы
- Декларативность: Чёткое объявление маршрутов в цепочке методов
- Гибкость: Комбинация базовых методов с фильтрами и ограничениями
- Интеграция: Полная совместимость с существующими Middleware
- OpenAPI: Встроенная поддержка генерации документации через WithOpenApi
Пример комплексной настройки
var app = WebApplication.Create();
var api = app.MapGroup("/api/v1")
.WithTags("API v1")
.RequireAuthorization();
var products = api.MapGroup("/products")
.WithTags("Products")
.CacheOutput("60s");
products.MapGet("/", GetProducts)
.WithName("GetProducts")
.Produces<List<Product>>(200);
products.MapGet("/{id:int:min(1)}", GetProductById)
.WithName("GetProductById")
.Produces<Product>(200)
.Produces(404);
app.Run();
Важное замечание: Несмотря на простоту Minimal APIs, для сложных сценариев рекомендуется оценить необходимость использования традиционных контроллеров, которые предоставляют более развитые возможности для сложной маршрутизации, фильтров и моделирования. Minimal APIs идеальны для микросервисов, простых API и прототипирования, но могут требовать большего количества шаблонного кода для enterprise-приложений.