Какие рекомендации по работе с REST API
Что проверяют
Умеете ли вы работать с API со стороны клиента: не просто вызвать fetch, а обработать ошибки, отмену, кеш и авторизацию. Следом обычно просят показать, как устроен слой запросов в вашем проекте, или спрашивают, чем PUT отличается от PATCH.
Как отвечать
Начните с семантики, потом переходите к клиентскому коду:
- методы:
GETбезопасный и идемпотентный,PUTзаменяет ресурс целиком и тоже идемпотентен,PATCHменяет часть полей,POSTне идемпотентен, поэтому слепо повторять его после таймаута нельзя; - ошибки:
fetchне отклоняет промис на 4xx и 5xx, только на сетевой сбой или отмену. Статус проверяется черезresponse.ok. Вaxiosнаоборот: по умолчанию ошибкой считается любой ответ вне 2xx; - отмена:
AbortControllerи егоsignalв запросе. Нужна при смене фильтра, размонтировании компонента и против гонок, когда ответ старого запроса приходит позже нового; - серверное состояние: TanStack Query или RTK Query дают дедупликацию, повторы, обновление при возврате на вкладку и инвалидацию после мутации. HTTP-кеш работает через
Cache-ControlиETagсIf-None-Match; - авторизация: токен надёжнее держать в
httpOnlycookie, а не вlocalStorage, откуда его прочитает любой XSS. С cookie появляютсяcredentials: 'include', настройка CORS на сервере и защита от CSRF; - типы: их генерируют из OpenAPI-схемы, а ответ на границе проверяют схемой Zod, чтобы изменение на бэкенде не ломало интерфейс молча.
Весь сетевой код держите в одном модуле: базовый клиент с общей обработкой ошибок и 401, а компоненты вызывают функции вроде getUser(id) и не собирают URL сами.
Где спотыкаются
Считают, что fetch сам отклонит промис на 404 или 500, и кладут в состояние тело ошибки как данные.
Не отменяют запросы. Пользователь быстро печатает в поиске, и на экране остаются результаты того запроса, который ответил последним, а не того, что был отправлен последним.
Хранят JWT в localStorage и не могут объяснить риск при XSS или путают CORS с защитой от CSRF: CORS ограничивает чтение ответа чужим сайтом, но не отправку запроса.