XMLHttpRequest

Материал из Википедии — свободной энциклопедии
Текущая версия страницы покане проверялась опытными участниками и может значительно отличаться отверсии, проверенной 29 сентября 2017 года; проверки требует21 правка.
Перейти к навигацииПерейти к поиску

XMLHttpRequest (XMLHTTP, XHR) —API, доступный вскриптовых языкахбраузеров, таких какJavaScript. Использует запросыHTTP илиHTTPS напрямую квеб-серверу (информация может передаваться в любомтекстовом формате, например, вXML,HTML илиJSON) и загружает данные ответа сервера напрямую в вызывающий скрипт[1]. Позволяет осуществлять HTTP-запросы к серверу без перезагрузки страницы.

XMLHTTP является важной составляющей технологииAJAX (Asynchronous JavaScript AndXML), используется многими сайтами для создания динамичных, быстро реагирующих на запросы пользователя приложений. Например XMLHTTP используется такими сайтами, какBing Maps,Gmail,Google Maps,Google Suggest,Facebook.

XMLHTTP работает только с файлами, находящимися на том же домене, что и использующая XMLHTTP страница, но существует возможность обойти ограничение. Как и в случае JavaScript, эта возможность обойти ограничение сделана с учётом обеспечения безопасности (cross-site scripting).

Хотя в названии присутствует аббревиатура XML, технология не накладывает ограничений на формат передаваемых данных. Данные можно пересылать как в виде XML, так и в JSON, HTML или просто неструктурированным текстом. Разработчик может самостоятельно создать формат для передачи данных. Однако нужно учитывать, что при пересылке используется текстовый протокол HTTP и потому при использовании метода GET данные должны передаваться в виде текста (то есть бинарные данные следует кодировать, к примеру вbase64). При использовании метода POST в кодировании нет необходимости.

Содержание

История

[править |править код]

Впервые был разработан компаниейMicrosoft, появившись в компонентеOutlook on the web программного продуктаMicrosoft Exchange Server 2000. Он был назван IXMLHTTPRequest. Позднее наработки были включены в составMSXML 2.0 в виде объектаActiveX, доступного черезJScript,VBScript или другие скриптовые языки, поддерживающиеся браузером. MSXML 2.0 был включён в состав браузераInternet Explorer 5.

Программисты проектаMozilla затем разработали совместимую версию, называющуюся nsIXMLHttpRequest в браузер Mozilla 0.6. Доступ к компоненту был реализован через JavaScript-объект, названный XMLHttpRequest. Однако, полной функциональности удалось добиться только в Mozilla 1.0. В дальнейшем поддержка XMLHttpRequest появилась в браузерахSafari 1.2,Opera 8.01 и в других.

Последняя официальная спецификация — версия 1.0 (XMLHttpRequest от 19 декабря 2012 года), которая имеет статус текущего стандарта (Living Standard) и версия 2.0 (XMLHttpRequest Level 2 от 17 января 2012 года), имеющая статус рабочего варианта. Во второй версии вводятся обработчики событий прогресса, поддержка кросс-доменных запросов и работа с бинарными данными.[2]

Методы класса XMLHttpRequest

[править |править код]
МетодОписание
abort()Отменяет текущий запрос, удаляет все заголовки, ставит текст ответа сервера в null.
getAllResponseHeaders()Возвращает полный список HTTP-заголовков в виде строки. Заголовки разделяются знаками переноса (CR+LF).
Если флаг ошибки равен true, возвращает пустую строку.
Если статус 0 или 1, вызывает ошибку INVALID_STATE_ERR.
getResponseHeader(headerName)Возвращает значение указанного заголовка.
Если флаг ошибки равен true, возвращает null.
Если заголовок не найден, возвращает null.
Если статус 0 или 1, вызывает ошибку INVALID_STATE_ERR.
open(method, URL, async, userName, password)Определяет метод, URL и другие опциональные параметры запроса;
параметр async определяет, происходит ли работа в асинхронном режиме.
Последние два параметра необязательны.
send(content)Отправляет запрос на сервер.
setRequestHeader(label, value)Добавляет HTTP-заголовок к запросу.
overrideMimeType(mimeType)Позволяет указать mime-type документа, если сервер его не передал или передал неправильно.
Внимание: метод отсутствует в Internet Explorer!

Свойства класса XMLHttpRequest

[править |править код]
СвойствоТипОписание
onreadystatechangeEventListenerОбработчик события, которое происходит при каждой смене состояния объекта. Имя должно быть записано в нижнем регистре.
readyStateunsigned shortТекущее состояние объекта (0 — не инициализирован, 1 — открыт, 2 — отправка данных, 3 — получение данных и 4 — данные загружены)
responseTextDOMStringТекст ответа на запрос.
Если состояние не 3 или 4, возвращает пустую строку.
responseXMLDocumentТекст ответа на запрос в виде XML, который затем может быть обработан посредствомDOM.
Если состояние не 4, возвращает null.
statusunsigned shortHTTP-статус в виде числа (404 — «Not Found»,200 — «OK» и т. д.)
statusTextDOMStringСтатус в виде строки («Not Found», «OK» и т. д.).
Если статус не распознан, браузер пользователя должен вызвать ошибку INVALID_STATE_ERR.

Ошибки, вызываемые классом XMLHttpRequest

[править |править код]
НазваниеКодОписание
SECURITY_ERR18Вызывается при попытке совершить запрос, запрещённый настройками безопасности в браузере пользователя.
NETWORK_ERR101Вызывается при ошибке сети (во время синхронного запроса).
ABORT_ERR102Вызывается при прерывании пользователем запроса (во время синхронного запроса).

Пример использования

[править |править код]

План работы с объектом XMLHttpRequest можно представить следующим образом:

  1. Создание экземпляра объекта XMLHttpRequest
  2. Открытие соединения
  3. Установка обработчика события (нужно делать после открытия и до отправки в IE)
  4. Отправка запроса.

Создание экземпляра объекта XMLHttpRequest.

На этой стадии необходима отдельная реализация для разных браузеров. Конструкция создания объекта различается: в IE 5 — IE 6 она реализована через ActiveXObject, а в остальных браузерах (IE 7 и выше, Mozilla, Opera, Chrome, Netscape и Safari) — как встроенный объект типа XMLHttpRequest.

Вызов для ранних версий Internet Explorer выглядит так[3]:

varreq=newActiveXObject("Microsoft.XMLHTTP");

В остальных браузерах:

varreq=newXMLHttpRequest();

То есть, для обеспечениякросс-браузерности кода нужно лишь проверять наличие объектов window.XMLHttpRequest и window.ActiveXObject, и, в зависимости от того, какой есть, тот и применять.

В качестве универсального решения предлагается использование такой функции:

functioncreateRequestObject(){if(typeofXMLHttpRequest==='undefined'){XMLHttpRequest=function(){try{returnnewActiveXObject("Msxml2.XMLHTTP.6.0");}catch(e){}try{returnnewActiveXObject("Msxml2.XMLHTTP.3.0");}catch(e){}try{returnnewActiveXObject("Msxml2.XMLHTTP");}catch(e){}try{returnnewActiveXObject("Microsoft.XMLHTTP");}catch(e){}thrownewError("This browser does not support XMLHttpRequest.");};}returnnewXMLHttpRequest();}

Установка обработчика событий, открытие соединения и отправка запросов

Эти вызовы выглядят так:

req.open(<"GET"|"POST"|...>,<url>[,<asyncFlag>[,<user>,<password>]]);req.onreadystatechange=processReqChange;

Где:

  • <"GET"|«POST»|…> —метод запроса. Допускаются: DELETE, GET, HEAD, OPTIONS, POST, PUT.
  • <url> — адрес запроса.
  • <asyncFlag> — флаг, определяющий, использовать ли асинхронный запрос. По умолчанию установлен в true.
  • <user>,<password> — логин и пароль, соответственно. Указываются при необходимости.

После определения всех параметров запроса его остается только отправить. Делается это методом send(). При отправке GET-запроса для версии без ActiveX необходимо указать параметр null, в остальных случаях можно не указывать никаких параметров. Не будет ошибкой, если для GET всегда будет указан параметр null:

req.send(null);

После этого начинает работать вышеуказанный обработчик событий. Он — фактически основная часть программы. В обработчике обычно происходит перехват всех возможных кодов состояния запроса и вызов соответствующих действий, а также перехват возможных ошибок.Пример кода с этими двумя функциями:

varreq;functionloadXMLDoc(url){req=null;if(window.XMLHttpRequest){try{req=newXMLHttpRequest();}catch(e){}}elseif(window.ActiveXObject){try{req=newActiveXObject('Msxml2.XMLHTTP');}catch(e){try{req=newActiveXObject('Microsoft.XMLHTTP');}catch(e){}}}if(req){req.open("GET",url,true);req.onreadystatechange=processReqChange;req.send(null);}}functionprocessReqChange(){try{// Важно!// только при состоянии "complete"if(req.readyState==4){// для статуса "OK"if(req.status==200){// обработка ответа}else{alert("Не удалось получить данные:\n"+req.statusText);}}}catch(e){// alert('Ошибка: ' + e.description);// В связи с багом XMLHttpRequest в Firefox приходится отлавливать ошибку// Bugzilla Bug 238559 XMLHttpRequest needs a way to report networking errors// https://bugzilla.mozilla.org/show_bug.cgi?id=238559}}

Известные проблемы

[править |править код]
Этот разделнужно дополнить.
Пожалуйста,улучшите и дополните раздел.(30 сентября 2016)

Малый размер буфера при загрузкевидео.

См. также

[править |править код]

Примечания

[править |править код]
  1. XMLHttpRequest object explained by the W3C Working Draft . W3.org. Дата обращения: 14 июля 2009. Архивировано 5 февраля 2012 года.
  2. Новые возможности XMLHttpRequest2 . Дата обращения: 30 сентября 2016. Архивировано 7 августа 2016 года.
  3. Native XMLHTTPRequest object . Дата обращения: 2 декабря 2009. Архивировано 6 марта 2010 года.

Литература

[править |править код]

Ссылки

[править |править код]

Реализация в браузерах:

Перейти к шаблону «JavaScript»
Идеи
Компиляторы
Движки
Библиотеки
ифреймворки
Редакторы
Инструменты
Связанные
технологии
Люди
Перейти к шаблону «Стандарты W3C»
Продукты
и стандарты
Рекомендации
ООСО
Рабочие проекты
Руководства
Инициативы
Выведенные
из использования
Устаревшие
Организации
Рабочие группы
Группы сообщества и бизнеса
Закрывшиеся группы
ПО
Браузеры
Конференции
Источник —https://ru.wikipedia.org/w/index.php?title=XMLHttpRequest&oldid=149816979
Категории:
Скрытые категории: