18.1.2. Получение ответа

We use cookies. Read the Privacy and Cookie Policy

Полный HTTP-ответ содержит код состояния, набор заголовков ответа и тело ответа. Все это доступно в виде свойств и методов объекта XMLHttpRequest:

• Свойства status и statusText возвращают код состояния HTTP в числовом и текстовом виде. Эти свойства хранят стандартные HTTP-значения, такие как 200 и «ОК» в случае успешного выполнения запроса или 404 и «Not Found» при попытке обратиться к ресурсу, отсутствующему на сервере.

• Заголовки ответа можно получить с помощью методов 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) {

  var request = new XMLHttpRequest(); // Создать новый запрос

  request.open("GET", url); // Указать URL-адрес ресурса

  request.onreadystatechange = function() {

    // Определить обработчик события

    // Если запрос был выполнен успешно

    if (request.readyState === 4 && request.status === 200) {

      var type = request.getResponseHeader("Content-Type");

      if (type.fnatch(/~text/)) // Убедиться, что это текст

        callback(request.responseText); // Передать функции

    }

  };

  request.send(null); // Отправить запрос

}