Методы выполнения GET запросов в среде JavaScript
Основы GET запросов в JavaScript
Как выполнить GET запрос с помощью fetch и async/await?
Современный и рекомендуемый способ отправки GET запросов в JavaScript - это использование функции fetch в сочетании с синтаксисом async/await. Этот метод предоставляет удобный интерфейс на основе промисов и хорошо интегрируется с современными стандартами.
Пример:
async function getData() {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error('HTTP error: ' + response.status);
}
const data = await response.json();
console.log(data);
} catch (error) {
console.error('Ошибка:', error);
}
}
getData();
Fetch js (fetch api в javascript)
Пояснение:
- Функция fetch возвращает промис, который разрешается объектом Response.
- Оператор await приостанавливает выполнение до получения ответа.
- Свойство response.ok показывает, был ли запрос успешным (статус 200-299).
- Метод response.json() парсит тело ответа как JSON.
- Блок try/catch перехватывает сетевые ошибки и ошибки парсинга.
Типичные ошибки:
- Забыть проверить response.ok – fetch не считает статусы 4xx/5xx ошибками промиса, они обрабатываются только через ok.
- Не использовать await внутри асинхронной функции – приведёт к получению промиса вместо данных.
- Ошибка CORS при запросе к другому домену – сервер должен разрешать кросс-доменные запросы.
Решение: всегда проверять response.ok, использовать catch, настраивать заголовки CORS на сервере.
Как выполнить GET запрос с помощью fetch и цепочек then?
Если требуется поддерживать старые среды без async/await, можно использовать классические цепочки промисов.
fetch('https://api.example.com/data')
.then(response => {
if (!response.ok) {
throw new Error('HTTP error: ' + response.status);
}
return response.json();
})
.then(data => console.log(data))
.catch(error => console.error('Ошибка:', error));
Js get (get запрос в javascript)
Цели использования: когда нужно выполнить несколько последовательных действий или когда среда не поддерживает async/await (редко).
Проблема: вложенные then могут усложнить читаемость при большом количестве шагов. Решение: использовать async/await или отдельные функции.
Как отправить GET запрос через XMLHttpRequest (XHR)?
Классический способ, который до сих пор применяется в старых проектах или при необходимости отслеживания прогресса загрузки.
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);
xhr.onload = function() {
if (xhr.status >= 200 && xhr.status < 300) {
console.log(JSON.parse(xhr.responseText));
} else {
console.error('Ошибка: ' + xhr.status);
}
};
xhr.onerror = function() {
console.error('Сетевая ошибка');
};
xhr.send();
Requests js (http-запросы на javascript)
Пояснение:
- open() задаёт метод, URL и асинхронность (true).
- onload срабатывает при успешном завершении запроса.
- responseText содержит текст ответа.
Типичные ошибки: забыть вызвать send(), перепутать onload и onreadystatechange, не обрабатывать onerror. Решение: следовать шаблону выше.
Как добавить параметры запроса (query string) к GET запросу?
Параметры передаются в URL после знака вопроса. Для удобного формирования используется URLSearchParams.
const params = new URLSearchParams({ id: 123, page: 2 });
const url = 'https://api.example.com/data?' + params.toString();
// Или: const url = 'https://api.example.com/data?' + params;
fetch(url)
.then(response => response.json())
.then(data => console.log(data));
Цели: фильтрация, поиск, пагинация на сервере.
Проблема: кодирование спецсимволов – URLSearchParams автоматически кодирует значения, но если формировать строку вручную, могут возникнуть ошибки. Решение: использовать URLSearchParams.
Как установить заголовки (headers) для GET запроса?
Заголовки передаются вторым аргументом fetch в объекте с полем headers.
fetch('https://api.example.com/data', {
headers: {
'Authorization': 'Bearer token123',
'Accept': 'application/json'
}
})
.then(response => response.json())
.then(data => console.log(data));
Цель: аутентификация, указание формата ответа, передача пользовательских данных.
Ошибка: некоторые заголовки (например, Content-Type) не имеют смысла для GET, попытка изменить запрещённые заголовки (User-Agent) может привести к ошибке. Решение: использовать только разрешённые заголовки.
Как обработать ошибки сети и таймауты?
Fetch не имеет встроенного таймаута, но его можно реализовать через AbortController.
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 5000);
fetch('https://api.example.com/data', { signal: controller.signal })
.then(response => {
clearTimeout(timeoutId);
return response.json();
})
.then(data => console.log(data))
.catch(err => {
if (err.name === 'AbortError') {
console.error('Запрос прерван по таймауту');
} else {
console.error('Ошибка:', err);
}
});
Цель: предотвращение зависания при недоступном сервере.
Проблема: если не очистить таймер в случае успеха, он может сработать после получения ответа. Решение: вызывать clearTimeout в then.
Расширенные примеры GET запросов
Загрузка текстового файла
async function getText() {
const response = await fetch('/file.txt');
const text = await response.text();
console.log(text);
}
getText();
(Вывод содержимого файла в виде строки)
Используется для загрузки HTML-фрагментов, конфигураций, логов.
Загрузка бинарных данных (Blob)
async function getImage(url) {
const response = await fetch(url);
const blob = await response.blob();
const imgUrl = URL.createObjectURL(blob);
document.getElementById('myImg').src = imgUrl;
}
getImage('https://example.com/image.png');
(Изображение отображается на странице)
Полезно для скачивания изображений, видео и других нетекстовых данных.
Параллельные GET запросы с Promise.all
async function getMultiple() {
const urls = ['/api/a', '/api/b', '/api/c'];
const promises = urls.map(url => fetch(url).then(res => res.json()));
const results = await Promise.all(promises);
console.log(results); // [dataA, dataB, dataC]
}
getMultiple();
[ { ... }, { ... }, { ... } ]
Ускоряет загрузку независимых данных.
Повторная попытка при неудаче (retry)
async function fetchWithRetry(url, retries = 3, delay = 1000) {
for (let attempt = 1; attempt <= retries; attempt++) {
try {
const response = await fetch(url);
if (!response.ok) throw new Error('Status ' + response.status);
return await response.json();
} catch (err) {
if (attempt === retries) throw err;
await new Promise(r => setTimeout(r, delay * attempt));
}
}
}
fetchWithRetry('https://api.example.com/unstable').then(console.log);
Повышает надёжность при временных сбоях.
Использование AbortController для отмены запроса
const controller = new AbortController();
setTimeout(() => controller.abort(), 2000);
fetch('https://httpstat.us/200?sleep=5000', { signal: controller.signal })
.then(res => res.text())
.then(console.log)
.catch(err => {
if (err.name === 'AbortError') {
console.log('Запрос отменён пользователем');
}
});
Запрос отменён пользователем
Полезно при переходе между страницами или отмене поиска.
Установка пользовательских заголовков через XMLHttpRequest
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/auth');
xhr.setRequestHeader('X-Custom-Header', 'value');
xhr.withCredentials = true; // для отправки куки
xhr.onload = () => console.log(xhr.responseText);
xhr.send();
(Ответ сервера)
Необходимо для аутентификации и работы с сессиями.
Получение заголовков ответа
fetch('https://api.example.com/data')
.then(response => {
console.log('Content-Type:', response.headers.get('Content-Type'));
console.log('Date:', response.headers.get('Date'));
return response.json();
});
Content-Type: application/json Date: Tue, 01 Apr 2025 10:00:00 GMT
Используется для проверки кэширования, формата и т.д.
Кэширование запроса с помощью cache API
async function cachedFetch(url) {
const cache = await caches.open('my-cache');
let response = await cache.match(url);
if (response) {
return response.json();
}
response = await fetch(url);
cache.put(url, response.clone());
return response.json();
}
cachedFetch('https://api.example.com/data').then(console.log);
Снижает нагрузку на сеть при повторных запросах.