- XHR
-
XMLHTTP (XMLHttpRequest, XHR) — набор API, используемый в языках JScript, VBScript и им подобных для пересылки различных данных (XHTML, HTTP-протоколу между браузером и веб-сервером. Позволяет осуществлять HTTP-запросы к удаленному серверу без необходимости перезагружать страницу.
XMLHTTP является важной составляющей технологии XML), используется многими сайтами для создания динамичных, быстро реагирующих на запросы пользователя приложений. Например XMLHTTP используется такими сайтами как Google Suggest, MSN Virtual Earth. XMLHTTP работает только с файлами, находящимися на том же домене, что и использующая XMLHTTP страница. Как и в случае JavaScript, это сделано в целях безопасности (cross-site scripting).
Кроме пересылки XML, через XMLHTTP можно обмениваться данными формы и просто текстовыми строками.
Содержание
История
Впервые был реализован компанией Internet Explorer 5.0 в виде объекта ActiveX, доступного через VBScript, или другие скриптовые языки, поддерживающиеся браузером. Программисты проекта Mozilla затем разработали совместимую версию, называющуюся XMLHttpRequest в Mozilla 1.0. В дальнейшем эта возможность также была реализована компаниями Safari 1.2, родственным браузером Opera Software начиная с
Методы класса 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
Ошибки, вызываемые классом XMLHttpRequest
Название Код Описание SECURITY_ERR 18 Вызывается при попытке совершить запрос, запрещённый настройками безопасности в браузере пользователя. NETWORK_ERR 101 Вызывается при ошибке сети (во время синхронного запроса). ABORT_ERR 102 Вызывается при прерывании пользователем запроса (во время синхронного запроса). Пример использования
План работы с объектом XMLHttpRequest можно представить следующим образом:
- Создание экземпляра объекта XMLHttpRequest
- Установка обработчика события
- Открытие соединения и отправка запроса.
Создание экземпляра объекта XMLHttpRequest.
На этой стадии необходима отдельная реализация для разных браузеров. Конструкция создания объекта отличается: в IE 5 - IE 6 она реализована через ActiveXObject, а в остальных браузерах (IE 7, Mozilla, Opera, Netscape и Safari) — как встроенный объект типа XMLHttpRequest.
Вызов для ранних версий Internet Explorer выглядит так:
var req = new ActiveXObject("Microsoft.XMLHTTP");
В более поздних версиях Internet Explorer (до IE7) рекомендуется использовать:
var req = new ActiveXObject("Msxml2.XMLHTTP");
В остальных браузерах:
var req = new XMLHttpRequest();
То есть, для обеспечения кросс-браузерности кода, нужно лишь проверять наличие объектов window.XMLHttpRequest и window.ActiveXObject, и, в зависимости от того, какой есть, тот и применять.
В качестве универсального решения предлагается использование такой функции:
function createRequestObject() { if (window.XMLHttpRequest) { try { return new XMLHttpRequest(); } catch (e){} } else if (window.ActiveXObject) { try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch (e){ try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch (e){} } } return null; }
Установка обработчика событий, открытие соединения и отправка запросов
Эти вызовы выглядят так:
req.open(<"GET"|"POST"|...>, <url>, <asyncFlag>); req.onreadystatechange = processReqChange;
После определения всех параметров запроса его остается только отправить. Делается это функцией send(). Если необходимо передать на сервер POST-данные, их надо подставить в качестве параметра для этой функции. POST-данные должны быть свернуты в URL-escaped строку (кодировка UTF-8) и добавлен заголовок req.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");. Другими словами эта строка будет иметь вид, который мы привыкли видеть в командной строке браузера, при передаче данных методом GET. При отправке GET-запроса для версии без ActiveX необходимо указать параметр null, в остальных случаях можно не указывать никаких параметров. Не будет ошибкой, если для GET всегда будет указан параметр null:
req.send(null);
После этого начинает работать вышеуказанный обработчик событий. Он — фактически основная часть программы. В обработчике обычно происходит перехват всех возможных кодов состояния запроса и вызов соответствующих действий, а также перехват возможных ошибок. Пример кода с этими двумя функциями:
var req; function loadXMLDoc(url) { req = null; if (window.XMLHttpRequest) { try { req = new XMLHttpRequest(); } catch (e){} } else if (window.ActiveXObject) { try { req = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e){ try { req = new ActiveXObject('Microsoft.XMLHTTP'); } catch (e){} } } if (req) { req.open("GET", url, true); req.onreadystatechange = processReqChange; req.send(null); } } function processReqChange() { try { // Важно! // только при состоянии "complete" if (req.readyState == 4) { // для статуса "OK" if (req.status == 200) { // обработка ответа } else { alert("Не удалось получить данные:\n" + req.statusText); } } } catch( e ) { // alert('Caught Exception: ' + e.description); // В связи с багом XMLHttpRequest в Firefox приходится отлавливать ошибку // Bugzilla Bug 238559 XMLHttpRequest needs a way to report networking errors // https://bugzilla.mozilla.org/show_bug.cgi?id=238559 } }
Известные проблемы
Проблема с кешированием в Microsoft Internet Explorer
Internet Explorer кеширует GET-запросы. Те авторы, которые не знакомы с кешированием HTTP, ожидают, что GET-запросы не кешируются, или что кеш может быть обойдён, как в случае нажатия кнопки обновления. В некоторых ситуациях избегание кеширования действительно является ошибкой. Одним из решений является использование метода POST, который никогда не кешируется; однако он предназначен для других операций. Другим решением является использование метода запроса GET, включающего уникальную строку запроса с каждым вызовом, как показано на примере ниже.
req.open("GET", "xmlprovider.php?hash=" + Math.random());
Следует помнить, что такой способ сильно забивает кеш. Лучше воспользоваться установкой заголовка Expires на прошедшую дату в вашем скрипте, который генерирует содержимое XML. В
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // disable IE caching header("Last-Modified: " . gmdate( "D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache");
Ссылки
Реализация в браузерах
- Apple Safari и KDE Konqueror
- Microsoft IXMLHTTPRequest
- Mozilla XMLHttpRequest object HowTo
- Mozilla XML Extras
- Opera для компьютеров и для мобильных телефонов
Учебные руководства
Стандарты
Литература
- Дейв Крейн, Эрик Паскарелло, Даррен Джеймс AJAX в действии: технология - Asynchronous JavaScript and XML = Ajax in Action. — М.: «Вильямс», 2006. — С. 640. — ISBN 1-932394-61-3
- Дари К., Бринзаре Б., Черчез-Тоза Ф., Бусика М. AJAX и PHP: разработка динамических веб-приложений. — СПб.: Символ Плюс, 2006. — С. 336. — ISBN 5-93286-077-4
Программные интерфейсы и Microsoft Windows Графика Проводник Windows • Direct3D • Windows Presentation Foundation • Windows Color System • Windows Image Acquisition • Windows Imaging Component Звук MME Мультимедиа DirectShow • Windows Media • Media Foundation Веб MSHTML • JScript • ActiveX • XMLHttpRequest • Гаджеты Доступ к данным Компоненты Microsoft Data Access • Extensible Storage Engine • Сети Winsock (LSP) • Filtering Platform • Коммуникации TAPI Администрирование Консоль Win32 • Windows Script Host • Инструментарий управления Windows • PowerShell • Планировщик задач • Offline Files • Теневое копирование • Windows Installer • Диспетчер ошибок Windows • Журнал событий Windows Модель компонентов COM • COM+ • DCOM • .NET Framework Библиотеки Microsoft Foundation Classes (MFC) • Active Template Library (ATL) • Windows Template Library (WTL) • Framework Class Library (FCL) Разработка драйверов Модель драйверов Windows • Windows Driver Foundation (KMDF • UMDF) Безопасность Windows CardSpace • Data protection API • Security Support Provider Interface .NET .NET Framework • ADO.NET • .NET Remoting • Windows Presentation Foundation • Windows Workflow Foundation • Windows Communication Foundation • Windows CardSpace • XNA • Межпроцессное
взаимодействиеMSRPC • Именованные каналы Текст и
поддержка языковFramework Текстовых сервисов • Объектная модель текстов • • Языковые пакеты • Многоязычный интерфейс Игры XNA • DirectX
Wikimedia Foundation. 2010.