XHR

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

Свойство Тип Описание
onreadystatechange EventListener Обработчик события, которое происходит при каждой смене состояния объекта. Имя должно быть записано в нижнем регистре.
readyState unsigned short Текущее состояние объекта (0 — не инициализирован, 1 — открыт, 2 — отправка данных, 3 — получение данных и 4 — данные загружены)
responseText DOMString Текст ответа на запрос.
Если статус не 3 или 4, возвращает пустую строку.
responseXML Document Текст ответа на запрос в виде XML, который затем может быть обработан посредством
status unsigned short HTTP-статус в виде числа (404 — «Not Found», 200 — «OK» и т. д.)
statusText DOMString Статус в виде строки («Not Found», «OK» и т. д.).
Если статус не распознан, браузер пользователя должен вызвать ошибку INVALID_STATE_ERR.

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

Название Код Описание
SECURITY_ERR 18 Вызывается при попытке совершить запрос, запрещённый настройками безопасности в браузере пользователя.
NETWORK_ERR 101 Вызывается при ошибке сети (во время синхронного запроса).
ABORT_ERR 102 Вызывается при прерывании пользователем запроса (во время синхронного запроса).

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

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

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

Создание экземпляра объекта 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. В

В сервлетах

Иначе можно заставить объект XMLHttpRequest всегда вытаскивать новое содержимое, не используя кеш.

req.open("GET", "xmlprovider.php");
req.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
req.send(null);

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

См. также


Wikimedia Foundation. 2010.

Игры ⚽ Поможем сделать НИР

Полезное


Смотреть что такое "XHR" в других словарях:

  • XHR — XMLHttpRequest XMLHttpRequest est un objet ActiveX ou Javascript qui permet d obtenir des données au format XML, JSON, mais aussi HTML, ou encore texte simple à l aide de requêtes HTTP. On explique le succès récent de l objet et la très grande… …   Wikipédia en Français

  • XHR — XMLHttpRequest ist eine API zum Transfer von beliebigen Daten über das Protokoll HTTP. Dabei können sämtliche HTTP Anfragemethoden (unter anderem GET, POST, HEAD, PUT) verwendet werden. Wenn eine Anfrage XML Daten liefert, kann XMLHttpRequest… …   Deutsch Wikipedia

  • Xhr — …   Deutsch Wikipedia

  • XHR — eXtreme Hot Rod (Governmental » Transportation) …   Abbreviations dictionary

  • xhr — ISO 639 3 Code of Language ISO 639 2/B Code : ISO 639 2/T Code : ISO 639 1 Code : Scope : Individual Language Type : Ancient Language Name : Hernican …   Names of Languages ISO 639-3

  • XHR — abbr. Xplizit Hardcore Recording …   Dictionary of abbreviations

  • Comet (programming) — Comet is a web application model in which a long held HTTP request allows a web server to push data to a browser, without the browser explicitly requesting it.[1][2] Comet is an umbrella term, encompassing multiple techniques for achieving this… …   Wikipedia

  • XMLHTTPRequest — est un objet ActiveX ou Javascript qui permet d obtenir des données au format XML, JSON, mais aussi HTML, ou encore texte simple à l aide de requêtes HTTP. On explique le succès récent de l objet et la très grande utilisation qui en est faite… …   Wikipédia en Français

  • XMLHttp — XMLHttpRequest XMLHttpRequest est un objet ActiveX ou Javascript qui permet d obtenir des données au format XML, JSON, mais aussi HTML, ou encore texte simple à l aide de requêtes HTTP. On explique le succès récent de l objet et la très grande… …   Wikipédia en Français

  • XMLHttpRequest — est un objet ActiveX ou Javascript qui permet d obtenir des données au format XML, JSON, mais aussi HTML, ou encore texte simple à l aide de requêtes HTTP. On explique le succès récent de l objet et la très grande utilisation qui en est faite… …   Wikipédia en Français


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»