XMLHttpRequest
Объект XMLHttpRequest - это API, который дает возможность из JavaScript делать HTTP-запросы к серверу без перезагрузки страницы и извлекать данные из ответа сервера. Название XMLHttpRequest является историческим и не имеет никакого отношения к его функциональности.
Пример запроса
Для начала рассмотрим пример получения данных при обращении на внешний сервер swapi.co.
Создадим простую разметку с кнопкой, по нажатию на которую будет осуществляться запрос на удаленный сервер.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <button id="btn" type="submit">GET</button> <script src="js/script.js"></script> </body> </html>Следующий шаг - создание объекта XMLHttpRequest в файле
script.js. Данный объект предоставляет функционал для обмена данными между клиентом (браузер) и сервером. Также нам нужно будет получить доступ к идентификатору кнопки.const btn = document.getElementById('btn') const request = new XMLHttpRequest()Примечание
Данные с сервера мы будем получать в формате JSON, поскольку это один из наиболее удобных форматов данных при взаимодействии с JavaScript.
К примеру, мы хотим получить данные про героя серии фильмов "Звездные войны" - Люка Скайвокера. Для этого нам необходимо произвести инициализацию соединения.
request.open('GET', 'https://swapi.co/api/people/1')Метод open принимает 5 аргументов:
method- GET, POST, PUT, DELETE.url- адрес сервера, куда необходимо отправить запрос (также это может быть адрес нужного нам файла)async- асинхронность запроса (по умолчанию true).login- учетные данные для авторизации.pass- учетные данные для авторизации.
Поскольку запрос асинхронный, установим специальный обработчик изменения свойства
readyStateдля получения данных от сервера.XMLHttpRequest имеет следующие свойства:
status - статус обработки данных (например 200, 304, 404)
statusText - статус обработки данных строкой(например OK, Not found и т.д.)
responseText or response (данные с сервера)
readyState (этапы отправки и получения данных):
0 - UNSENT - Объект был создан. Метод open() еще не вызывался.
1 - OPENED - Метод open() был вызван.
2 - HEADERS_RECEIVED - Метод send() был вызван, доступны заголовки (headers) и статус.
3 - LOADING - Загрузка; responseText содержит частичные данные.
4 - DONE - Операция полностью завершена.
Чтобы понять, что операция получения данных с сервера была завершена успешно, нам нужно будет проверить два условия:
readyStateдолжен быть равен 4 (то есть операция была полностью завершена)statusдолжен быть равен 200 (успешное получение ответа).
request.onreadystatechange = function() { if (request.readyState === 4 && request.status === 200) { const res = JSON.parse(request.response) console.log(res) } }Теперь, когда сам запрос готов, необходимо отправить его на сервер. Для этого нам нужно вызывать специальный метод
send().request.send()Важно!
Файл ".html" необходимо запускать в режиме редактора "Live Preview". К примеру, в IntelliJ IDEA / Webstorm это:

A в VS Code:

В результате в консоли мы можем увидеть, что нам пришли данные от сервера в формате
JSON, которые были преобразованы в обычный объект JavaScript.
xhr
Также на ресурсе httpbin.org есть возможность потестировать запросы по остальным HTTP методам, например POST, но тогда в этом случае код нужно будет немного изменить соблюдая следующие правила:
Данные перед отправкой нужно привести в JSON формат.
Перед отправкой нужно указать заголовки запроса, используя метод
setRequestHeader(). К примеру, в запросах клиента заголовокContent-Typeсообщает серверу, в каком формате передаваются данные.
Данный пример показан с соблюдением пунктов, указанных выше:
В ответ сервер отправит объект с различными свойствами, включая данные, которые мы отправляли в запросе:

Рассмотрим некоторые нюансы получения данных
Допустим, нам нужно получить с сервера картинку. Для этого можно использовать ресурс starwars-visualguide.com
Поскольку картинка приходит асинхронно в двоичном формате, необходимо вызвать метод URL.createObjectURL() у объекта window, который создает DOMString, содержащий URL с указанием на объект. Новый URL объект может представлять собой Blob объект, который в свою очередь представляет из себя объект наподобие файла с неизменяемыми, необработанными данными. Blob-ы представляют данные, которые могут быть не в родном формате JavaScript, что позволит сохранить картинку на странице.
Результат выполнения запроса будет следующим:

В консоль инспектора мы вывели ссылку на картинку и сам обьект Blob, внутри которого есть два аргумента: объем и формат картинки.
Полезные ссылки
1. Более детальное описание возможностей XMLHttpRequest
2. Основы работы XMLHttpRequest
3. Работа Blob обьектам
Last updated