Сетевые запросы: Fetch API

Как клиент общается с сервером: запрос, ответ, коды состояния, JSON и корректная обработка ошибок. Работает и с внешним API, и с локальным файлом.

fetch async / await JSON

Демонстрация запросов

Нажмите кнопку и наблюдайте за состоянием: загрузка → успех или ошибка.

Готово к работе
Здесь появится ответ сервера…
Локальный запрос требует http(s). При открытии страницы напрямую с диска (file://) браузер заблокирует fetch из-за политики CORS. На хостинге всё работает.

Базовый шаблон запроса

js
async function loadData(url) {
  const response = await fetch(url);

  // ВАЖНО: fetch не отклоняет промис при 404 и 500!
  if (!response.ok) {
    throw new Error('HTTP ' + response.status + ': ' + response.statusText);
  }

  return response.json();
}

try {
  const data = await loadData('/api/items');
  console.log(data);
} catch (error) {
  console.error('Запрос не удался:', error.message);
}
Самая частая ошибка новичков — считать, что fetch сам «падает» при ошибке 404. Нет: промис отклоняется только при сетевом сбое. Код ответа нужно проверять вручную через response.ok.

Состояния загрузки

js
button.disabled = true;
showSpinner(true);

try {
  const data = await loadData(url);
  render(data);
} catch (e) {
  showError(e.message);
} finally {
  button.disabled = false;   // finally выполнится в любом случае
  showSpinner(false);
}

Что важно помнить про HTTP

КодЗначениеЧто делать клиенту
200OKОбработать данные
301 / 302Перенаправлениеfetch следует автоматически
400Некорректный запросПоказать ошибку валидации
401 / 403Нет доступаЗапросить авторизацию
404Не найденоСообщить пользователю
500Ошибка сервераПредложить повторить позже

Задание

  1. Выведите данные не в <pre>, а карточками в сетке Grid.
  2. Добавьте кнопку «Отмена» через AbortController.
  3. Кешируйте результат в localStorage и показывайте его, если сети нет.
  4. Замерьте через performance.now(), сколько миллисекунд занял запрос, и выведите это пользователю.