18.1. Использование объекта XMLHttpRequest

Прикладной интерфейс к протоколу HTTP в броузерах определяется в виде класса XMLHttpRequest. Каждый экземпляр этого класса представляет единственную пару запрос/ответ, а свойства и методы объекта позволяют определять параметры запроса и извлекать данные из ответа. Объект XMLHttpRequest поддерживается вебброузерами уже довольно давно, а его прикладной интерфейс находится на последних стадиях стандартизации консорциумом W3C. В то же время в консорциуме W3C ведутся работы над проектом стандарта «XMLHttpRequest Level 2». В этом разделе мы рассмотрим базовый прикладной интерфейс объекта XMLHttpRequest, а также те части проекта стандарта «XMLHttpRequest Level 2» (я называю его «XHR2»), которые в настоящее время реализованы как минимум в двух броузерах.

Первое, что обычно необходимо сделать при использовании этого прикладного интерфейса к протоколу HTTP, это, разумеется, создать экземпляр объекта XMLHttpRequest:

var request = new XMLHttpRequest();

Допустимо повторно использовать уже имеющийся экземпляр объекта XMLHttpRequest, но следует иметь в виду, что в этом случае будет прервано выполнение запроса, уже отправленного объектом.

XMLHttpRequest в IE6

Корпорация включила поддержку объекта XMLHttpRequest в свой броузер IE, начиная с версии 5. В версиях IE5 и IE6 этот объект доступен только в виде ActiveX-объекта. Поддержка современного стандартного конструктора XMLHttpRequest() появилась только в IE7, но его можно имитировать, как показано ниже:

// Имитация конструктора XMLHttpRequest() в IE5 и IE6

if (window.XMLHttpRequest === undefined) {

  window.XMLHttpRequest = function() {

    try {

      // Использовать последнюю версию ActiveX-объекта, если доступна

      return new ActiveX0bject("Msxml2.XMLHTTP.6.0 ");

    }

    catch (el) {

      try {

        // Иначе вернуться к старой версии

          return new ActiveXObject("Msxml2.XMLHTTP.3.О");

      }

      catch(e2) {

        // Если ничего не получилось - возбудить ошибку

        throw new Error("XMLHttpRequest не поддерживается”);

      }

    }

  };

}

***********************************************

HTTP-запрос состоит из четырех частей:

• метод HTTP-запроса или тип «операции»

• запрашиваемый URL-адрес

• необязательные заголовки запроса, которые могут включать информацию для аутентификации

• необязательное тело запроса

HTTP-ответ, возвращаемый сервером, состоит из трех частей:

• числовое и текстовое значение, определяющее код состояния, свидетельствующий об успехе или об ошибке

• набор заголовков ответа

• тело ответа

Первые два подраздела, следующие далее, демонстрируют, как устанавливать каждую часть HTTP-запроса и как извлекать части из HTTP-ответа. За этими ключевыми разделами следуют подразделы, освещающие более узкоспециализированные темы.

Базовая архитектура запрос/ответ протокола HTTP весьма проста в использовании. Однако на практике возникает масса сложностей: клиенты и серверы обмениваются данными в виде cookies; серверы переадресуют броузеры на другие серверы; одни ресурсы кэшируются, а другие - нет; некоторые клиенты отправляют запросы через прокси-серверы и т. д. Объект XMLHttpRequest не является прикладным интерфейсом уровня протокола, он обеспечивает прикладной интерфейс уровня броузера. Броузер сам заботится о cookies, переадресации, кэшировании и прокси-серверах, а вам достаточно позаботиться только о запросах и ответах.

XMLHttpRequest и локальные файлы

Возможность использования относительных URL-адресов в веб-страницах обычно означает, что HTML-страницы можно разрабатывать и проверять, используя локальную файловую систему, а затем перемещать их на веб-сервер без дополнительных изменений. Однако, как правило, это невозможно при использовании архитектуры Ajax на основе объекта XMLHttpRequest. Объект XMLHttpRequest предназначен для работы с протоколами HTTP и HTTPS. Теоретически он мог было работать с другими протоколами, такими как FTP, но такие части прикладного интерфейса, как метод запроса и код состояния ответа, являются характерными именно для протокола HTTP. Если загрузить веб-страницу из локального файла, сценарии в этой странице не смогут использовать объект XMLHttpRequest с относительными URL-адресами, потому что эти адреса будут относительными адресами вида file://, а не http://. А политика общего происхождения зачастую будет препятствовать использованию абсолютных адресов вида http://. (Тем не менее загляните в раздел 18.1.6.) Таким образом, чтобы проверить вебстраницы, использующие объект XMLHttpRequest, их необходимо выгружать на веб-сервер (или использовать локальный веб-сервер).

***************************************************