Как назвать endpoint
Что проверяют
Умеете ли вы проектировать API как набор ресурсов, а не как список удалённых функций, и знаете ли соглашения, которые делают его предсказуемым. Следом обычно дают неудобный случай: как назвать действие, которое плохо ложится на CRUD, например «отменить заказ».
Как отвечать
Базовые правила REST-стиля:
- существительные во множественном числе:
/users,/orders, а действие выражает HTTP-метод.GET /ordersотдаёт список,POST /ordersсоздаёт,GET /orders/42отдаёт один заказ,PATCHчастично обновляет,DELETEудаляет; - вложенность для принадлежности:
/users/42/orders, но не глубже одного-двух уровней. Если id заказа уникален,/orders/42удобнее, чем/users/42/orders/42; - фильтры, сортировка, пагинация в query:
/orders?status=paid&limit=20, а не отдельные пути вида/orders/paid; - регистр: пути в нижнем регистре через дефис (
/payment-methods), поля JSON в одном стиле на весь API. В Python чащеsnake_case, а Pydantic черезalias_generatorотдастcamelCase, если так договорились с фронтендом; - версия:
/api/v1/...в пути или в заголовке, один способ на весь API.
Действия вне CRUD оформляют либо подресурсом: POST /orders/42/cancellation, либо глаголом в конце: POST /orders/42/cancel. Второе допустимо, если такие случаи единичны. Главное, чтобы действие не висело на GET: браузер, прокси или краулер могут его повторить.
В FastAPI и Django REST Framework помните про завершающий слэш. DefaultRouter в DRF по умолчанию генерирует пути со слэшем, а FastAPI при несовпадении отвечает редиректом 307 (redirect_slashes=True). Выберите один вариант и держите его везде.
Где спотыкаются
Пишут глаголы в путях: /getUsers, /createOrder, /deleteUser?id=5. Метод уже говорит, что происходит, и API превращается в RPC с лишним словом.
Смешивают единственное и множественное число: /user/5 рядом с /orders. Клиенту приходится помнить исключения.
Возвращают 200 с телом {"error": ...} вместо правильного кода. Имя эндпоинта может быть идеальным, но без 404, 409 и 422 клиент не отличит успех от ошибки. FastAPI сам отдаёт 422 на невалидное тело запроса.