Что такое path параметры в URL
Что проверяют
Понимаете ли вы, что адрес идентифицирует ресурс, и раскладываете ли данные по местам: сегмент пути говорит, что именно запрашивают, строка запроса уточняет, как именно отдать. Попутно проверяют знание маршрутизации и валидации в своём фреймворке.
Как отвечать
Path-параметр это переменный сегмент пути, объявленный в шаблоне маршрута и подставляемый из запроса: /users/{user_id}/orders/{order_id}. Он обязателен по определению: если сегмента нет, шаблон не совпадёт и до обработчика дело не дойдёт, тогда как параметры строки запроса опциональны.
@app.get("/users/{user_id}")
async def get_user(user_id: int) -> dict:
return {"id": user_id}Аннотация типа здесь работает и как валидация: нечисловое значение отсекается до тела функции. В Django ту же роль играют конвертеры пути, во Flask угловые скобки с типом.
Что добавить сверх определения: значение кодируется процентной записью, и слеш внутри него либо экранируется, либо забирается конвертером остатка пути; статический сегмент объявляют раньше переменного, иначе адрес вида /users/me уедет в обработчик идентификатора; путь целиком попадает в логи, кэши и метрики, поэтому токенам и персональным данным там не место.
Где спотыкаются
Кладут в путь то, что на самом деле фильтр или сортировка. Схема маршрутов ломается на первом же новом условии, а кэш и аналитика получают бесконечное число разных адресов вместо одного ресурса.
Считают типизацию проверкой прав. Конвертер гарантирует формат, но не то, что объект принадлежит текущему пользователю, и подстановка идентификатора из пути прямо в запрос даёт классический доступ к чужим данным перебором.
Смешивают коды ответа. Несовпадение шаблона это 404, неверный тип значения обычно 422 или 400, существующий объект без прав это 403 или, если сам факт существования скрывают, снова 404. Последнее решение стоит проговорить осознанно, а не получить случайно.