Маршрутизация и model binding

↑ 3.3 Web API: контроллеры, Minimal API, валидация · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Уточняют: откуда берутся параметры, что такое route constraints и как работает endpoint routing.

Объяснение

Endpoint routing: UseRouting сопоставляет запрос с endpoint, последующие middleware (авторизация, CORS) видят выбранный endpoint, UseEndpoints/Map* исполняет его.

app.MapGet("/orders/{id:guid}", (Guid id) => ...);
app.MapGet("/files/{**path}", (string path) => ...);       // catch-all
app.MapGet("/users/{name:alpha:minlength(3)}", ...);

Ограничения: int, guid, bool, datetime, min, max, range, regex, alpha.

Model binding

ИсточникАтрибутПо умолчанию
Маршрут[FromRoute]параметры из шаблона
Query[FromQuery]простые типы
Тело[FromBody]сложные типы в [ApiController]
Заголовок[FromHeader]нет
Форма[FromForm]файлы, формы
DI[FromServices]зарегистрированные сервисы в Minimal API
app.MapGet("/search", ([AsParameters] SearchQuery q) => ...);   // группировка query в record
 
public record SearchQuery(string? Text, int Page = 1, [FromHeader(Name = "X-Tenant")] string? Tenant = null);

System.Text.Json десериализует тело; настройки (регистр, enum, null) задаются ConfigureHttpJsonOptions.

Нюансы и подводные камни

  • Тело запроса читается один раз; повторное чтение требует EnableBuffering.
  • Формат даты/чисел зависит от культуры для query; используйте инвариантные форматы.
  • Конфликт маршрутов даёт AmbiguousMatchException.
  • Без ограничения guid/int невалидное значение приведёт к 404 или 400 в зависимости от типа.
  • Регистронезависимость маршрутов включена, параметров JSON — только camelCase по умолчанию.

Практика

  1. Добавьте ограничения к маршрутам и проверьте ответы на неверный формат.
  2. Соберите query-параметры фильтра через [AsParameters].
  3. Реализуйте catch-all маршрут для файлов.

Вопросы с ответами

Связанные темы