Шрифт:
• Заголовки ответа можно получить с помощью методов
getResponseHeader
и getAllResponseHeaders.
Обработка cookies выполняется объектом XMLHttpRequest
автоматически: он исключает заголовки «Cookie» из множества, возвращаeмого методом getAllResponseHeaders,
и возвращает null, если передать аргумент «Set-Cookie» или «Set-Cookie2» методу getResponseHeader.
• Тело ответа в текстовом виде доступно через свойство
responseText
или в виде объекта Document
через свойство responseXML
. (Выбор такого имени свойства объясняется историческими причинами: фактически оно предназначено для работы с XHTML- и XML-документами, но спецификация «ХНН2» определяет, что оно также должно работать с обычными HTML-документами.) Более подробно о свойстве responseXML
рассказывается в разделе 18.1.2.2. Обычно объект
XMLHttpRequest
используется в асинхронном режиме (но загляните в раздел 18.1.2.1): метод send
возвращает управление сразу же после отправки запроса, поэтому методы и свойства, перечисленные выше, не могут использоваться до фактического получения ответа. Чтобы определить момент получения ответа, необходимо обрабатывать событие «readystatechange» (или событие «progress», определяемое новой спецификацией «ХНН2» и описываемое в разделе 18.1.4), возбуждаемое в объекте XMLHttpRequest
. Но, чтобы понять, как обрабатывать это событие, необходимо сначала разобраться со свойством readyState
. Свойство
readyState
– это целочисленное значение, определяющее код состояния HTTP-запроса; его возможные значения перечислены в табл. 18.1. Идентификаторы, указанные в первой колонке, - это константы, определяемые конструктором XMLHttpRequest
. Эти константы являются частью спецификации XMLHttpRequest
, но старые версии броузеров и ІE8 не определяют их, поэтому часто можно увидеть программный код, в котором вместо константы XMLHttpRequest.DONE
используется числовое значение 4. Теоретически событие «readystatechange» генерируется всякий раз, когда изменяется значение свойства
readyState
. На практике же событие может не возбуждаться, когда свойство readyState
получает значение 0 или 1. Оно часто возбуждается при вызове метода send,
даже при том, что свойство readyState
по-прежнему содержит значение OPENED
. Некоторые броузеры возбуждают событие множество раз для состояния LOADING
, чтобы обеспечить обратную связь. Все броузеры возбуждают событие «readystatechange», когда завершается прием ответа сервера и свойство readyState
получает значение 4. Так как это событие может возбуждаться еще до завершения приема ответа, обработчики события «readystatechange» всегда должны проверять значение свойства readyState
. Чтобы обрабатывать события «readystatechange», нужно присвоить функцию обработчика события свойству
onreadystatechange
объекта XMLHttpRequest
. Можно также воспользоваться методом addEventListener
(или attachEvent
в IE версии 8 и ниже), но обычно для обработки запроса бывает вполне достаточно одного обработчика, поэтому проще установить свойство onreadystatechange
.
Пример 18.2 определяет функцию
getText,
которая демонстрирует особенности обработки событий «ready statechange». Обработчик события сначала проверяет завершение запроса. После этого он проверяет код состояния ответа и убеждается в успешном выполнении. Затем он извлекает заголовок «Content-Type», чтобы убедиться, что получен ответ ожидаемого типа. Если выполняются все три условия, он передает тело ответа (в виде текста) указанной функции обратного вызова. Пример 18.2. Получение HTTP-ответа в обработчике onreadystatechange
// Выполняет запрос HTTP GET содержимого указанного URL-адреса.
// После успешного получения ответа проверяет, содержит ли он простой текст,
// и передает его указанной функции обратного вызова
function getText(url, callback) {