В каких местах HTTP-запроса можно передать полезную нагрузку с клиента на сервер?
Что проверяют
Знаете ли вы устройство HTTP-запроса и как ASP.NET Core связывает каждую его часть с параметрами действия. Следом обычно спрашивают, можно ли передать тело в GET и куда класть чувствительные данные.
Как отвечать
Запрос состоит из стартовой строки (метод, путь, версия), заголовков и необязательного тела. Данные можно передать в пяти местах, у каждого своя привязка:
- путь:
/api/orders/42, идентификатор ресурса.[FromRoute], шаблон{id:int}; - строка запроса:
?status=paid&page=2, фильтры, сортировка, пагинация.[FromQuery]; - заголовки: метаданные и служебное,
Authorization,Accept-Language,Idempotency-Key, идентификаторы корреляции.[FromHeader(Name = "X-Request-Id")]; - тело: основной объём данных в
POST,PUT,PATCH. Формат задаётContent-Type:application/jsonсвязывается через[FromBody]иSystem.Text.Json, формы (application/x-www-form-urlencoded,multipart/form-data) через[FromForm], файлы черезIFormFile; - cookie: браузер отправляет их сам, читаются через
Request.Cookies. Отдельного атрибута привязки для них в MVC нет.
Скажите о поведении по умолчанию: в контроллере с [ApiController] сложные типы берутся из тела, простые из маршрута и строки запроса. В minimal API логика похожая, а параметр из тела может быть только один.
Про ограничения: в спецификации нет лимита на длину URL, но серверы и прокси его вводят. У Kestrel по умолчанию MaxRequestLineSize 8 КБ, заголовки суммарно до 32 КБ, тело до 30 000 000 байт (MaxRequestBodySize). Секреты в query попадают в логи и историю браузера, их передают в заголовке или теле.
Где спотыкаются
Отправляют тело в GET. RFC 9110 не придаёт ему смысла, часть прокси и клиентов его отбрасывает, а в старом .NET Framework такой запрос вызывал исключение. Для сложного поиска делают POST на отдельный эндпоинт.
Ставят [FromBody] на два параметра одного действия. Тело читается один раз, привязать из него можно только один параметр, остальное заворачивают в общую модель.
Кладут токены в строку запроса ради удобства и потом находят их в логах балансировщика.