JavaScript & TypeScriptМодуль 5: Асинхронность
Fetch API
HTTP-запросы в JavaScript
Цель урока
В этом уроке ты научишься:
- Отправлять HTTP-запросы
- Обрабатывать ответы
- Работать с разными методами и заголовками
Базовый запрос
fetch("https://api.example.com/data")
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.log("Ошибка:", error));С async/await
async function getData() {
try {
let response = await fetch("https://api.example.com/data");
let data = await response.json();
console.log(data);
} catch (error) {
console.log("Ошибка:", error);
}
}Объект Response
let response = await fetch("/api/data");
console.log(response.ok); // true если статус 200-299
console.log(response.status); // 200
console.log(response.statusText); // "OK"
console.log(response.headers); // Headers объектПроверка статуса
async function getData() {
let response = await fetch("/api/data");
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`);
}
return response.json();
}Важно
fetch не выбрасывает ошибку при статусах 4xx и 5xx. Проверяй response.ok.
Методы чтения тела
let response = await fetch("/api/data");
// JSON
let json = await response.json();
// Текст
let text = await response.text();
// Бинарные данные
let blob = await response.blob();
let buffer = await response.arrayBuffer();
// Form data
let formData = await response.formData();Параметры запроса
GET с параметрами
let params = new URLSearchParams({
page: 1,
limit: 10,
search: "hello"
});
let response = await fetch(`/api/items?${params}`);POST с JSON
let response = await fetch("/api/users", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
name: "Иван",
email: "ivan@example.com"
})
});PUT, PATCH, DELETE
// PUT
await fetch("/api/users/1", {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "Пётр" })
});
// PATCH
await fetch("/api/users/1", {
method: "PATCH",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "Пётр" })
});
// DELETE
await fetch("/api/users/1", {
method: "DELETE"
});Заголовки
Отправка заголовков
let response = await fetch("/api/data", {
headers: {
"Authorization": "Bearer token123",
"Content-Type": "application/json",
"X-Custom-Header": "value"
}
});Чтение заголовков ответа
let response = await fetch("/api/data");
console.log(response.headers.get("Content-Type"));
console.log(response.headers.get("X-Total-Count"));
// Перебор
for (let [key, value] of response.headers) {
console.log(`${key}: ${value}`);
}FormData
let formData = new FormData();
formData.append("name", "Иван");
formData.append("avatar", fileInput.files[0]);
let response = await fetch("/api/upload", {
method: "POST",
body: formData
// Content-Type устанавливается автоматически
});Отмена запроса
let controller = new AbortController();
// Отменить через 5 секунд
setTimeout(() => controller.abort(), 5000);
try {
let response = await fetch("/api/data", {
signal: controller.signal
});
} catch (error) {
if (error.name === "AbortError") {
console.log("Запрос отменён");
}
}Практические примеры
API-обёртка
async function api(endpoint, options = {}) {
let url = `https://api.example.com${endpoint}`;
let config = {
headers: {
"Content-Type": "application/json",
...options.headers
},
...options
};
if (config.body && typeof config.body === "object") {
config.body = JSON.stringify(config.body);
}
let response = await fetch(url, config);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
return response.json();
}
// Использование
let users = await api("/users");
let newUser = await api("/users", {
method: "POST",
body: { name: "Иван" }
});Практика
Задание 1: GET запрос
Задача: Получи данные и выведи их.
Loading...
Ваш вывод:
Задание 2: POST запрос
Задача: Отправь данные на сервер.
Loading...
Ваш вывод:
Задание 3: Обработка ошибок
Задача: Обработай ошибку HTTP.
Loading...
Ваш вывод:
Проверь себя
- Что возвращает
fetch? - Как проверить успешность запроса?
- Как отправить JSON в теле запроса?