
AJAX (Asynchronous JavaScript and XML) – это технология, которая позволяет загружать данные в фоновом режиме без необходимости перезагрузки всей страницы. В этой статье мы рассмотрим, как создать AJAX запрос с использованием чистого JavaScript, не прибегая к сторонним библиотекам.
Первый шаг – создание объекта XMLHttpRequest. Этот объект позволяет взаимодействовать с сервером, отправляя запросы и получая ответы. Пример создания объекта:
var xhr = new XMLHttpRequest();
Далее следует настройка запроса с помощью метода open. Важно определить, какой тип запроса будет использоваться – GET или POST, и указать URL для отправки. Также важно отметить, что запрос может быть синхронным или асинхронным. Для асинхронной работы указываем true в параметре async.
xhr.open('GET', 'https://example.com/data', true);
После этого нужно назначить обработчик событий для отслеживания состояния запроса. С помощью события onreadystatechange мы можем реагировать на изменения состояния запроса и обрабатывать полученные данные, как только сервер ответит.
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
console.log(xhr.responseText);
}
};
Последний шаг – отправка запроса с помощью метода send. Для GET-запросов параметры могут быть переданы через URL, а для POST-запросов – через тело запроса. В случае с POST отправка данных будет выглядеть так:
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('param1=value1¶m2=value2');
Теперь запрос выполнен, и при успешном завершении мы можем обработать ответ, например, вывести его на страницу или использовать в дальнейшей логике приложения.
Настройка XMLHttpRequest для первого запроса

Первый шаг в работе с AJAX – создание объекта XMLHttpRequest. Этот объект будет использоваться для отправки запросов на сервер и получения данных. Рассмотрим, как настроить его для выполнения простого запроса.
Чтобы создать XMLHttpRequest, используйте следующий код:
var xhr = new XMLHttpRequest();
После этого объект можно настроить для отправки GET или POST запроса на сервер.
- GET-запрос: используется для получения данных с сервера. Важно понимать, что GET-запросы могут быть кэшированы, и они не подходят для отправки конфиденциальных данных.
- POST-запрос: используется для отправки данных на сервер, чаще всего используется для отправки форм или загрузки файлов.
Для отправки запроса нужно вызвать метод open(), указав метод, URL и флаг асинхронности. Пример для GET-запроса:
xhr.open('GET', 'https://example.com/data', true);
Параметры:
- ‘GET’ – метод запроса (может быть ‘POST’, ‘PUT’ и др.)
- ‘https://example.com/data’ – адрес сервера, на который отправляется запрос
- true – асинхронный режим, позволяющий не блокировать выполнение других операций на странице
Если запрос POST, то после open() нужно указать заголовки, если это необходимо:
xhr.setRequestHeader('Content-Type', 'application/json');
Теперь запрос готов для отправки. Для этого вызываем метод send():
xhr.send();
Для POST-запроса передаем данные в теле запроса. Например, для отправки данных в формате JSON:
xhr.send(JSON.stringify({name: 'John', age: 30}));
После того как запрос отправлен, важно установить обработчик для получения ответа от сервера. Для этого используется событие onreadystatechange. С его помощью отслеживается состояние запроса:
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
console.log(xhr.responseText);
}
};
Здесь readyState – это состояние запроса, которое изменяется с момента его создания до завершения. Когда readyState равен 4, запрос завершен, и можно проверять status для получения кода ответа. Если статус 200, значит, запрос выполнен успешно.
Для асинхронного запроса также можно использовать метод onload:
xhr.onload = function() {
if (xhr.status === 200) {
console.log(xhr.responseText);
}
};
Таким образом, создание и настройка XMLHttpRequest включает несколько ключевых шагов: создание объекта, настройка параметров, отправка данных и обработка ответа. После выполнения этих шагов можно эффективно работать с AJAX-запросами в JavaScript.
Как отправить GET-запрос с параметрами в URL
GET-запросы с параметрами широко используются для передачи данных через URL. Параметры добавляются к URL после знака вопроса и разделяются амперсандом (&). Вот пошаговое объяснение того, как отправить такой запрос с помощью JavaScript.
-
Создание URL с параметрами.
Параметры добавляются в URL после знака «?» и записываются в формате
ключ=значение. Если параметров несколько, они разделяются амперсандом. Например:https://example.com/api?user=JohnDoe&age=30
-
Создание запроса с помощью объекта
XMLHttpRequest.Для отправки GET-запроса можно использовать объект
XMLHttpRequest. Для этого создайте новый экземпляр объекта:let xhr = new XMLHttpRequest();
-
Открытие соединения с сервером.
Используйте метод
openдля указания метода (GET), URL с параметрами и асинхронный режим (true):xhr.open('GET', 'https://example.com/api?user=JohnDoe&age=30', true); -
Обработка ответа от сервера.
Для обработки данных, полученных от сервера, необходимо использовать событие
onreadystatechange. Когда запрос завершен, можно проверить статус ответа и работать с данными:xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } }; -
Отправка запроса.
После настройки запроса его нужно отправить с помощью метода
send. В случае GET-запроса можно передатьnullили оставить аргумент пустым:xhr.send(null);
Таким образом, для отправки GET-запроса с параметрами в URL достаточно правильно построить URL, создать запрос, настроить обработку ответа и отправить запрос.
Отправка POST-запроса с данными в теле запроса
Для отправки POST-запроса с данными в теле запроса используется объект XMLHttpRequest или современный Fetch API. Оба метода позволяют отправить данные на сервер, не перезагружая страницу. Ниже рассматривается пример использования каждого из них.
В случае с XMLHttpRequest нужно создать объект, установить метод и URL, а затем отправить данные в теле запроса. Пример кода:
let xhr = new XMLHttpRequest();
xhr.open("POST", "/submit", true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log("Ответ сервера: ", xhr.responseText);
}
};
let data = JSON.stringify({name: "John", age: 30});
xhr.send(data);
Здесь мы используем метод open для установки типа запроса (POST), адреса (/submit) и асинхронности (true). С помощью setRequestHeader устанавливаем тип содержимого в JSON, чтобы сервер знал, как интерпретировать данные. Данные, которые отправляются, конвертируются в строку формата JSON через JSON.stringify.
Для более современного подхода используем Fetch API. Этот метод удобен, поскольку возвращает Promise и позволяет более гибко обрабатывать ошибки. Пример:
fetch("/submit", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({name: "John", age: 30})
})
.then(response => response.json())
.then(data => console.log("Ответ сервера: ", data))
.catch(error => console.error("Ошибка:", error));
Метод fetch выполняет запрос, передавая данные в теле запроса через параметр body. Заголовок Content-Type указывает серверу, что данные передаются в формате JSON. Ответ сервера обрабатывается с использованием then, который позволяет работать с результатом асинхронного запроса.
При отправке POST-запросов важно учитывать обработку ошибок на серверной стороне. Если сервер не поддерживает формат данных или возникает ошибка в процессе передачи, это нужно учитывать в коде через catch в случае с Fetch API или через обработку ошибок с помощью состояния readyState в XMLHttpRequest.
Не забывайте про безопасность данных. При отправке чувствительной информации (например, паролей) обязательно используйте HTTPS для защиты данных в пути. Также всегда валидируйте данные на сервере, чтобы предотвратить атаки через подмену данных в теле запроса.
Обработка ответа сервера и проверка статуса запроса

После отправки AJAX-запроса важно корректно обработать ответ сервера и убедиться, что запрос завершился успешно. Основной инструмент для этого – событие onreadystatechange объекта XMLHttpRequest. Его свойство readyState принимает значения от 0 до 4, где 4 означает, что ответ получен полностью.
Проверка статуса запроса осуществляется через status. Значение 200 подтверждает успешное выполнение, 404 указывает на отсутствие ресурса, 500 сигнализирует о внутренней ошибке сервера. Рекомендуется использовать конструкцию:
if (xhr.readyState === 4 && xhr.status === 200) – только в этом случае обрабатывать данные.
Для обработки ответа применяют свойства responseText и responseXML. responseText возвращает строку, которую при необходимости преобразуют в JSON через JSON.parse(). responseXML удобен при работе с XML-данными, позволяя использовать стандартные методы DOM для навигации по узлам.
Для ошибок целесообразно создать отдельный блок else или try-catch, чтобы логировать код ошибки и текст ответа, что облегчает отладку и предотвращает некорректное выполнение последующих операций.
Пример корректной обработки:
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
let data = JSON.parse(xhr.responseText);
console.log(data);
} else {
console.error(‘Ошибка: ‘ + xhr.status, xhr.responseText);
}
}
};
Обязательная проверка readyState и status исключает обработку частичных ответов и обеспечивает надежность работы AJAX-запроса в любых сетевых условиях.
Обработка ошибок: что делать при сбое запроса
При использовании AJAX критически важно обрабатывать ошибки, чтобы избежать некорректного поведения интерфейса и потери данных. Основные причины сбоев – сетевые проблемы, тайм-ауты, ошибки сервера (5xx) и клиентские ошибки (4xx).
Для начала используйте событие onerror или метод catch при работе с fetch. Например, при XMLHttpRequest проверяйте xhr.status и сравнивайте с диапазонами 200–299. Любое значение вне этого диапазона следует считать ошибкой.
Рекомендуется реализовать повторный запрос с ограничением числа попыток. Например, при сетевой ошибке можно повторять запрос до 3 раз с интервалом 500–1000 мс. Если все попытки неудачны, следует уведомить пользователя о проблеме и предложить повторить действие вручную.
Логирование ошибок помогает выявлять повторяющиеся сбои. Для этого можно отправлять информацию о коде ответа, URL запроса и времени возникновения на сервер или сохранять в консоль для последующего анализа.
Особое внимание уделяйте тайм-аутам. Для XMLHttpRequest используйте свойство xhr.timeout, а в fetch оборачивайте промис в таймер с AbortController. Это предотвращает зависание приложения при долгих задержках сети.
При обработке ошибок также важно корректно очищать состояние интерфейса: отключать индикаторы загрузки, блокировать кнопки повторного запроса и не допускать дублирования данных в DOM.
Для клиентских ошибок (4xx) полезно анализировать тело ответа. Оно часто содержит подсказки для исправления запроса, например недостающие параметры или неверный формат данных.
В итоге структура обработки ошибок должна включать: проверку статуса ответа, тайм-аут, повторный запрос с ограничением, логирование и корректное обновление интерфейса. Такой подход минимизирует сбои и обеспечивает стабильную работу AJAX-запросов.
Как использовать JSON для отправки и получения данных
JSON (JavaScript Object Notation) применяется для структурирования данных в формате ключ-значение. Для отправки данных через AJAX используется метод JSON.stringify(), который преобразует объект JavaScript в строку JSON.
Пример отправки данных методом POST:
const data = {name: "Иван", age: 30};
fetch('/api/users', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data) })
Для получения данных с сервера используется метод response.json(), который преобразует JSON-строку в объект JavaScript. Пример:
fetch('/api/users') .then(response => response.json()) .then(data => console.log(data));
Важно указывать заголовок Content-Type: application/json при отправке данных, иначе сервер может не распознать формат.
При работе с массивами и вложенными объектами JSON сохраняет структуру данных, что позволяет напрямую манипулировать объектами на стороне клиента без дополнительных преобразований.
Для отладки рекомендуются console.log(JSON.stringify(data)) перед отправкой и console.log(data) после получения, чтобы проверить корректность сериализации и десериализации.
При обработке ошибок следует проверять наличие поля status или error в JSON-ответе и использовать try...catch для безопасного преобразования строки в объект.
JSON обеспечивает компактность передачи данных, совместимость с любым современным браузером и легкую интеграцию с серверными языками, такими как Python, PHP, Node.js.
Добавление заголовков для работы с API

Для добавления заголовков в AJAX-запрос через XMLHttpRequest используют метод setRequestHeader. Заголовки необходимо устанавливать после вызова open и до send. Пример:
const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.example.com/data');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('Authorization', 'Bearer YOUR_TOKEN');
xhr.send(JSON.stringify({ key: 'value' }));
Для fetch заголовки передаются в объекте headers. Например:
fetch('https://api.example.com/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_TOKEN'
},
body: JSON.stringify({ key: 'value' })
});
При работе с CORS важно, чтобы сервер разрешал нужные заголовки. Заголовки, которые не указаны в Access-Control-Allow-Headers ответа сервера, будут блокироваться браузером.
Для тестирования рекомендуются инструменты типа Postman или curl, чтобы убедиться в корректной передаче заголовков перед интеграцией в JavaScript.
Как улучшить производительность с использованием асинхронности
Асинхронные запросы позволяют выполнять сетевые операции без блокировки основного потока исполнения JavaScript. Это особенно важно при работе с AJAX, где задержки сервера могут напрямую влиять на отклик интерфейса.
Для улучшения производительности рекомендуется использовать следующие техники:
| Метод | Описание | Пример реализации |
|---|---|---|
| Fetch API с async/await | Позволяет писать асинхронный код в виде последовательного, что упрощает обработку ошибок и повышает читаемость. |
async function loadData() {
try {
const response = await fetch('/data');
const result = await response.json();
console.log(result);
} catch (error) {
console.error(error);
}
}
|
| Параллельные запросы | Использование Promise.all ускоряет выполнение нескольких независимых запросов, снижая суммарное время ожидания. |
async function loadAll() {
const urls = ['/data1', '/data2', '/data3'];
const results = await Promise.all(urls.map(url => fetch(url).then(r => r.json())));
console.log(results);
}
|
| Lazy-loading данных | Загрузка информации только по необходимости снижает объем передаваемых данных и нагрузку на сервер. |
button.addEventListener('click', async () => {
const response = await fetch('/more-data');
const data = await response.json();
renderData(data);
});
|
| Кэширование ответов | Хранение полученных данных в памяти или localStorage уменьшает количество повторных запросов и ускоряет повторный доступ. |
let cache = {};
async function getData(url) {
if (cache[url]) return cache[url];
const response = await fetch(url);
const data = await response.json();
cache[url] = data;
return data;
}
|
| Debounce для частых вызовов | Снижает нагрузку при обработке событий, вызывающих AJAX, например, ввод текста в поисковой строке. |
function debounce(fn, delay) {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => fn(...args), delay);
};
}
|
Сочетание этих подходов позволяет сократить время отклика приложения на 30–50% в реальных проектах с интенсивной загрузкой данных, снижает риск блокировки интерфейса и упрощает масштабирование клиентской логики.
Вопрос-ответ:
Что такое AJAX и зачем он нужен в веб-разработке?
AJAX — это метод взаимодействия веб-страницы с сервером без полной перезагрузки. Он позволяет отправлять запросы и получать ответы в фоновом режиме, что ускоряет работу сайта и улучшает пользовательский опыт. Например, при автозаполнении формы или подгрузке комментариев можно получить данные с сервера сразу, не обновляя страницу полностью.
Какие основные шаги нужно выполнить для создания AJAX запроса на JavaScript?
Сначала создается объект XMLHttpRequest или используется современный fetch. Затем указывается тип запроса (GET или POST) и URL, куда отправлять данные. После этого задаются функции для обработки ответа от сервера и ошибок. Наконец, запрос отправляется с помощью метода send, а полученные данные обрабатываются в функции обратного вызова или промисе. На практике последовательность действий выглядит так: создать объект, настроить запрос, определить обработчик, отправить запрос, обработать ответ.
В чем разница между использованием XMLHttpRequest и fetch для AJAX запросов?
XMLHttpRequest — это старый способ выполнения AJAX запросов. Он требует установки нескольких свойств и написания обработчиков событий, что иногда выглядит громоздко. Fetch использует промисы, что позволяет писать код более компактно и легко управлять цепочкой действий после получения ответа. Fetch также проще комбинировать с асинхронными функциями async/await, что упрощает обработку последовательных запросов. Несмотря на это, XMLHttpRequest иногда удобен для обратной совместимости с устаревшими браузерами.
Как правильно обрабатывать ошибки при выполнении AJAX запроса?
При использовании XMLHttpRequest нужно проверять статус ответа (status) и состояние запроса (readyState), чтобы определить успешное завершение. Если статус не 200, можно вывести сообщение об ошибке или предпринять альтернативное действие. В fetch ошибки сети и проблемы с сервером обрабатываются в блоке catch, а проверка статуса ответа проводится вручную. Дополнительно полезно предусмотреть таймаут, чтобы запрос не зависал слишком долго, и информировать пользователя о проблеме.
