Методы выполнения GET запросов в среде JavaScript

Раздел: Веб-разработка -> HTTP

Основы 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);

Снижает нагрузку на сеть при повторных запросах.

GET запрос в JavaScript - comments

En
Js get (javascript)