Как кэширование POST-запросов влияет на работу с таблицами
Что проверяют
Различаете ли вы HTTP-кэш и кэш данных на клиенте и умеете ли держать таблицу актуальной после изменений. Следом обычно просят показать, что происходит с таблицей после добавления строки и как не создать дубль при повторной отправке.
Как отвечать
Разведите два случая, в которых POST встречается рядом с таблицей.
Первый: POST используют для чтения. Сложные фильтры и сортировки не влезают в URL, и таблица грузится запросом POST /users/search. Так же устроен GraphQL, где почти все запросы идут через POST. Здесь HTTP-кэш почти не помогает: по RFC 9110 ответ на POST кэшируется только при явной свежести и совпадающем Content-Location, браузеры и CDN на практике его не хранят, а Cache API в сервис-воркере вообще отказывается класть запрос с методом POST. Значит, кэш строится на уровне приложения:
- ключ из параметров: в TanStack Query
queryKey: ['users', filters, page], и тот же набор фильтров отдаётся из кэша; staleTime: сколько данные считаются свежими и не перезапрашиваются при возврате на экран;placeholderData: keepPreviousData: таблица не мигает пустотой при переключении страницы;- нормализованный кэш:
InMemoryCacheв Apollo хранит сущности по id, и правка одной записи видна во всех таблицах сразу.
Второй: POST меняет данные. После создания или правки строки кэш таблицы устаревает, и его нужно сбросить: invalidateQueries({ queryKey: ['users'] }), теги invalidatesTags в RTK Query или оптимистичное обновление через setQueryData с откатом при ошибке.
Где спотыкаются
Отвечают «POST не кэшируется, значит проблем нет». Проблема как раз в клиентском кэше: без инвалидации пользователь добавил строку и не видит её в таблице.
Сбрасывают только текущую страницу. Новая запись могла попасть на другую страницу или сдвинуть сортировку, поэтому инвалидируют весь префикс ключа.
Не думают о повторной отправке. Двойной клик или ручной ретрай создаёт дубль строки. Защищаются блокировкой кнопки на время запроса и заголовком Idempotency-Key, который сервер проверяет.