Чтение онлайн

ЖАНРЫ

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

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://, а неА политика общего происхождения зачастую будет препятствовать использованию абсолютных адресов вида(Тем не менее загляните в раздел 18.1.6.) Таким образом, чтобы проверить вебстраницы, использующие объект
XMLHttpRequest
, их необходимо выгружать на веб-сервер (или использовать локальный веб-сервер).

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

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

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

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

request.open("GET". // Запрос типа HTTP GET

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

Первый аргумент метода

open
определяет HTTP-метод или операцию. Это строка, не чувствительная к регистру, но обычно содержащая только символы верхнего регистра, в соответствии со спецификацией протокола HTTP. Методы «GET» и «POST» поддерживаются всеми броузерами. Метод «GET» используется для «обычных» запросов и соответствует случаю, когда URL-адрес полностью определяет запрашиваемый ресурс. Он используется, когда запрос не имеет побочных эффектов и когда ответ сервера можно поместить в кэш. Метод «POST» обычно используется HTML-формами. Он включает в тело запроса дополнительные данные (данные формы), и эти данные часто сохраняются в базе данных на стороне сервера (побочный эффект). В ответ на повторяющиеся запросы POST к одному и тому же URL сервер может возвращать разные ответы, и ответы на запросы, отправленные этим методом, не должны помещаться в кэш.

Помимо запросов «GET» и «POST», спецификация

XMLHttpRequest
также позволяет передавать методу
open
строки «DELETE», «HEAD», «OPTIONS» и «PUT» в первом аргументе. (Методы «HTTP CONNECT», «TRACE» и «TRACK» явно запрещены к использованию из-за проблем с безопасностью.) Старые версии броузеров могут не поддерживать все эти методы, но метод «HEAD», по крайней мере, поддерживается почти всеми броузерами, и его использование демонстрируется в примере 18.13.

Поделиться с друзьями: