← Назад к вопросам

Какие знаешь способы настройки маршрутизации в minimal APIs?

2.0 Middle🔥 191 комментариев
#ASP.NET и Web API

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Способы настройки маршрутизации в 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-приложений.

Какие знаешь способы настройки маршрутизации в minimal APIs? | PrepBro