XMLHttpRequest
Last updated
Last updated
Объект XMLHttpRequest - это API, который дает возможность из JavaScript делать HTTP-запросы к серверу без перезагрузки страницы и извлекать данные из ответа сервера. Название XMLHttpRequest является историческим и не имеет никакого отношения к его функциональности.
Пример запроса
Для начала рассмотрим пример получения данных при обращении на внешний сервер .
Создадим простую разметку с кнопкой, по нажатию на которую будет осуществляться запрос на удаленный сервер.
Следующий шаг - создание объекта XMLHttpRequest в файле script.js
. Данный объект предоставляет функционал для обмена данными между клиентом (браузер) и сервером. Также нам нужно будет получить доступ к идентификатору кнопки.
Примечание
Данные с сервера мы будем получать в формате JSON, поскольку это один из наиболее удобных форматов данных при взаимодействии с JavaScript.
К примеру, мы хотим получить данные про героя серии фильмов "Звездные войны" - Люка Скайвокера. Для этого нам необходимо произвести инициализацию соединения.
Метод 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 (успешное получение ответа).
Теперь, когда сам запрос готов, необходимо отправить его на сервер. Для этого нам нужно вызывать специальный метод send()
.
Важно!
Файл ".html" необходимо запускать в режиме редактора "Live Preview". К примеру, в IntelliJ IDEA / Webstorm это:
A в VS Code:
В результате в консоли мы можем увидеть, что нам пришли данные от сервера в формате JSON
, которые были преобразованы в обычный объект JavaScript.
Данные перед отправкой нужно привести в JSON формат.
Перед отправкой нужно указать заголовки запроса, используя метод setRequestHeader()
. К примеру, в запросах клиента заголовок Content-Type
сообщает серверу, в каком формате передаваются данные.
Данный пример показан с соблюдением пунктов, указанных выше:
В ответ сервер отправит объект с различными свойствами, включая данные, которые мы отправляли в запросе:
Рассмотрим некоторые нюансы получения данных
Поскольку картинка приходит асинхронно в двоичном формате, необходимо вызвать метод URL.createObjectURL()
у объекта window
, который создает DOMString
, содержащий URL
с указанием на объект. Новый URL
объект может представлять собой Blob
объект, который в свою очередь представляет из себя объект наподобие файла с неизменяемыми, необработанными данными. Blob
-ы представляют данные, которые могут быть не в родном формате JavaScript, что позволит сохранить картинку на странице.
Результат выполнения запроса будет следующим:
В консоль инспектора мы вывели ссылку на картинку и сам обьект Blob
, внутри которого есть два аргумента: объем и формат картинки.
Полезные ссылки
Также на ресурсе есть возможность потестировать запросы по остальным HTTP методам, например POST
, но тогда в этом случае код нужно будет немного изменить соблюдая следующие правила:
Допустим, нам нужно получить с сервера картинку. Для этого можно использовать ресурс