JavaScript. Подробное руководство, 6-е издание, стр. 276

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

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

Прикладной интерфейс к протоколу HTTP в броузерах определяется в виде класса

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

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

<b>XMLHttpRequest</b>
:

<b>var request = new XMLHttpRequest();</b>

Допустимо повторно использовать уже имеющийся экземпляр объекта

<b>XMLHttpRequest</b>
, но следует иметь в виду, что в этом случае будет прервано выполнение запроса, уже отправленного объектом.

XMLHttpRequest в IE6

Корпорация включила поддержку объекта

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

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

<b>if (window.XMLHttpRequest === undefined) {</b>

<b>  window.XMLHttpRequest = function() {</b>

<b>    try {</b>

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

<b>      return new ActiveX0bject(&quot;Msxml2.XMLHTTP.6.0 &quot;);</b>

<b>    }</b>

<b>    catch (el) {</b>

<b>      try {</b>

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

<b>          return new ActiveXObject(&quot;Msxml2.XMLHTTP.3.О&quot;);</b>

<b>      }</b>

<b>      catch(e2) {</b>

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

<b>        throw new Error(&quot;XMLHttpRequest не поддерживается”);</b>

<b>      }</b>

<b>    }</b>

<b>  };</b>

<b>}</b>

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

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

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

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

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

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

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

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

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

• тело ответа

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

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

<b>XMLHttpRequest</b>
не является прикладным интерфейсом уровня протокола, он обеспечивает прикладной интерфейс уровня броузера. Броузер сам заботится о cookies, переадресации, кэшировании и прокси-серверах, а вам достаточно позаботиться только о запросах и ответах.

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

Возможность использования относительных URL-адресов в веб-страницах обычно означает, что HTML-страницы можно разрабатывать и проверять, используя локальную файловую систему, а затем перемещать их на веб-сервер без дополнительных изменений. Однако, как правило, это невозможно при использовании архитектуры Ajax на основе объекта

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

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

18.1.1. Выполнение запроса

Следующий этап после создания объекта

<b>XMLHttpRequest</b>
- определение параметров HTTP-запроса вызовом метода
<b>ореn()</b>
объекта XMLHttpRequest, которому передаются две обязательные части запроса: метод и URL:

<b>request.open(&quot;GET&quot;. // Запрос типа HTTP GET</b>

<b>       &quot;data.csv&quot;); // на получение содержимого по этому URL-адресу</b>