> Как фронтенд должен обрабатывать отсутствие ответа на POST запрос к API (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: sferaplatform.ru

Стек: Go

> Пример ответа

Короткий ответ

Фронтенд должен обрабатывать отсутствие ответа на POST как сетевую ошибку, а не как успех или бизнес-отказ. Ключевое - не считать запрос завершённым, пока не получен явный ответ. Нужно реализовать таймаут, retry с идемпотентностью (например, через Idempotency-Key), и корректно сообщить пользователю о неопределённом статусе операции. Важно помнить: отсутствие ответа не означает, что сервер не выполнил операцию - состояние могло измениться.

Подробное объяснение

Отсутствие ответа на POST - это классическая проблема распределённых систем. В отличие от GET, POST изменяет состояние на сервере. Если ответ потерян (сеть, таймаут, падение сервера после обработки), клиент не знает, была ли операция выполнена.

Основные сценарии:

  • запрос не дошёл до сервера - операция не выполнена
  • запрос дошёл, но ответ потерян - операция выполнена, клиент не знает
  • сервер упал во время обработки - состояние неопределённое

Для Go-бэкенда важно, чтобы фронтенд понимал: сервер может вернуть 202 Accepted с последующим опросом статуса, либо использовать идемпотентные ключи. Фронтенд должен:

  • устанавливать разумный таймаут (не бесконечное ожидание)
  • не показывать ошибку сразу - сначала retry
  • при retry использовать тот же Idempotency-Key, чтобы сервер не выполнил операцию дважды
  • после исчерпания попыток - сообщить пользователю: "статус операции неизвестен, проверьте позже"

На практике

Для senior-позиции важно показать понимание trade-off между простотой и надёжностью. На практике:

  1. Таймаут - обязателен. Обычно 10-30 секунд для POST.
  2. Retry - 2-3 попытки с экспоненциальной задержкой (например, 1s, 2s, 4s).
  3. Идемпотентность - генерировать Idempotency-Key на клиенте и передавать в заголовке.
  4. UI-состояние - после всех попыток показать "операция не подтверждена", дать кнопку "проверить статус" или "повторить".
  5. Для длительных операций - использовать 202 Accepted + polling или WebSocket.

Пример для Go-бэкенда: если сервер поддерживает идемпотентность, фронтенд может безопасно повторять запрос. Если нет - повторять нельзя, только сообщить о неопределённости.

Пример кода

JAVASCRIPT
async function postWithRetry(url, body, maxRetries = 3) {
const idempotencyKey = crypto.randomUUID();
const headers = { 'Content-Type': 'application/json', 'Idempotency-Key': idempotencyKey };
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 15000);
const response = await fetch(url, {
method: 'POST',
headers,
body: JSON.stringify(body),
signal: controller.signal
});
clearTimeout(timeout);
if (response.ok) {
return await response.json();
}
// 5xx - можно повторить, 4xx - нет
if (response.status < 500) {
throw new Error(`Request failed: ${response.status}`);
}
} catch (err) {
if (err.name === 'AbortError') {
console.warn(`Attempt ${attempt + 1} timed out`);
} else if (attempt < maxRetries - 1) {
const delay = Math.pow(2, attempt) * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
continue;
}
}
}
throw new Error('Operation status unknown - server may have processed the request');
}

Как отвечать на собеседовании

Начни с главного: отсутствие ответа - это не ошибка валидации, а сетевая неопределённость. Затем перечисли ключевые механизмы: таймаут, retry, идемпотентность. Подчеркни, что для POST повторная отправка без идемпотентности опасна. Упомяни паттерн 202 Accepted для длительных операций. Покажи, что понимаешь разницу между "запрос не выполнен" и "статус неизвестен". Для senior важно сказать про распределённые системы и невозможность атомарной гарантии доставки.

Что проверяет интервьюер

  • понимание сетевых протоколов и ограничений HTTP
  • знание идемпотентности и её реализации
  • умение проектировать надёжные клиент-серверные взаимодействия
  • способность различать типы ошибок (4xx, 5xx, network)
  • понимание UX-последствий: пользователь должен видеть честное состояние
  • знание паттернов: retry, backoff, timeout, polling

Типичные ошибки

  • считать отсутствие ответа ошибкой сервера - это может быть потеря сети
  • повторять POST без идемпотентности - риск дублирования операции
  • бесконечный retry без таймаута - блокировка UI
  • показывать "успех" после таймаута - ложное подтверждение
  • не различать 4xx (не повторить) и 5xx (можно повторить)
  • игнорировать заголовок Retry-After от сервера
  • не сообщать пользователю о неопределённом статусе - худший вариант

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью