JS Async

Fetch API

Научиться делать HTTP-запросы с помощью fetch: GET, POST, обработка ответа, проверка ошибок и понимание CORS на beginner-уровне.

Средний (Intermediate)
Нужно знать:async/awaitJSON

Кратко

fetch(url) возвращает Promise с Response. Response содержит: status, ok, headers. Для получения данных вызовите response.json() (тоже Promise). fetch НЕ reject на HTTP 404/500 — проверяйте response.ok. CORS — ограничение браузера для cross-origin запросов.


Подробно

Простейший GET: const response = await fetch('https://api.example.com/users'); const users = await response.json(); console.log(users);

Fetch возвращает Promise<Response>. Response — это не данные, а «обёртка» с метаданными.

Проверка ошибок: const response = await fetch('/api/data');

if (!response.ok) { throw new Error(HTTP ${response.status}: ${response.statusText}); }

const data = await response.json();

Важно: fetch НЕ reject автоматически на HTTP 404/500! Он reject ТОЛЬКО при сетевой ошибке (нет соединения, DNS).

POST запрос: const response = await fetch('/api/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: 'Анна', email: 'anna@test.com' }) });

if (!response.ok) throw new Error('Ошибка'); const result = await response.json();

Response свойства:

  • response.ok — true если status 200-299
  • response.status — HTTP статус (200, 404, 500)
  • response.headers — заголовки ответа
  • response.url — итоговый URL (после редиректов)

HTTP основы:

  • GET — получить данные
  • POST — создать данные
  • PUT — обновить данные целиком
  • PATCH — обновить частично
  • DELETE — удалить данные

CORS (Cross-Origin Resource Sharing): Браузер блокирует запросы к другому домену (origin), если сервер не разрешает это через заголовки.

origin = protocol + domain + port https://example.com:443

same-origin: https://example.com/page cross-origin: https://other.com/api

Сервер разрешает через: Access-Control-Allow-Origin: https://example.com

CORS — НЕ ошибка сервера. Это ограничение браузера для безопасности.


Ментальная модель

fetch — как отправка письма. Вы пишете запрос (URL + метод), отправляете (fetch), получаете конверт (Response). Конверт содержит не только письмо (данные), но и служебную информацию (status, headers). Чтобы прочитать письмо, нужно вскрыть конверт (response.json()).


Примеры

**Самый простой:**

javascript
const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
const todo = await response.json();
console.log(todo.title); // 'delectus aut autem'

Простейший GET запрос с парсингом JSON.

**Простой:**

javascript
async function getUsers() {
  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/users');
    
    if (!response.ok) {
      throw new Error(`HTTP ${response.status}`);
    }
    
    const users = await response.json();
    users.forEach(user => console.log(user.name));
    
  } catch (error) {
    console.log(`Ошибка: ${error.message}`);
  }
}

await getUsers();

GET с проверкой response.ok и обработкой ошибок.

**Реальный пример:**

javascript
async function createPost(title, body) {
  const response = await fetch('https://jsonplaceholder.typicode.com/posts', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ title, body, userId: 1 })
  });
  
  if (!response.ok) {
    throw new Error(`HTTP ${response.status}`);
  }
  
  const post = await response.json();
  console.log(`Создан пост #${post.id}`);
  return post;
}

await createPost('Новый пост', 'Текст поста');

POST запрос с JSON телом и обработкой ответа.


Частые ошибки

**Неправильно:** Думать, что fetch reject на HTTP 404/500

**Почему:** fetch resolve с Response даже на 404/500. Reject только при сетевой ошибке.

**Правильно:** Всегда проверяйте response.ok или response.status.

**Неправильно:** Забывать await перед response.json()

**Почему:** response.json() возвращает Promise, а не объект.

**Правильно:** const data = await response.json();

**Неправильно:** Не устанавливать Content-Type для POST

**Почему:** Сервер может не распознать тело запроса без правильного Content-Type.

**Правильно:** headers: { 'Content-Type': 'application/json' }

**Неправильно:** Путать CORS с ошибкой сервера

**Почему:** CORS — ограничение браузера. Сервер может работать нормально, но браузер блокирует ответ.

**Правильно:** CORS = браузерное ограничение, не серверная ошибка.


Важно запомнить

  • fetch возвращает Promise<Response>
  • response.json() — тоже Promise, нужен await
  • fetch НЕ reject на HTTP 404/500 — проверяйте response.ok
  • POST: method, headers, body (JSON.stringify)
  • CORS — ограничение браузера для cross-origin запросов
  • GET — получение, POST — создание, PUT/PATCH — обновление, DELETE — удаление

Связь

Назад: Вы понимаете async/await и промисы (JA4-JA6) — теперь вы применяете их к реальным HTTP-запросам.

Вперёд: Вы завершили JS Async! Дальше — DOM Advanced: события, делегирование и браузерные API.


Читайте дальше

Материалы курса JS Async — PROlab Academy.