Книга: JavaScript. Подробное руководство, 6-е издание
18.1.2.2. Декодирование ответа
18.1.2.2. Декодирование ответа
В примерах выше предполагалось, что сервер возвращает ответ в виде простого текста, с MIME-типом «text/ріаіп», «text/html» или «text/css», и мы извлекаем его из свойства responseText
объекта XMLHttpRequest
.
Однако существуют и другие способы обработки ответов сервера. Если сервер посылает в ответе XML- или XHTML-документ, разобранное представление XML-документа можно получить из свойства responseXML
. Значением этого свойства является объект Document
, при работе с которым можно использовать приемы, представленные в главе 15. (Проект спецификации «XHR2» требует, чтобы броузеры автоматически выполняли синтаксический анализ ответов типа «text/html» и также делали их доступными через свойство responseXML
в виде объектов Document, но на момент написания этих строк это требование не было реализовано в текущих броузерах.)
Если в ответ на запрос серверу потребуется отправить структурированные данные, такие как объект или массив, он может передать данные в виде строки в формате JSON (раздел 6.9). После получения такой строки содержимое свойства responseText
можно передать методу JSON.parse().
Пример 18.3 является обобщенной версией примера 18.2: он выполняет запрос методом GET по указанному URL-ад-ресу и после получения содержимого этого адреса передает его указанной функции обратного вызова. Но теперь функции не всегда будет передаваться простой текст - ей может быть передан объект Document
, объект, полученный с помощью JSON.parse(),
или строка.
Пример 18.3. Синтаксический анализ НТТР-ответа
// Выполняет запрос HTTP GET на получение содержимого по указанному URL-адресу.
// При получении ответа он передается функции обратного вызова
// как разобранный объект XML-документа, объект JS0N или строка,
function get(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");
// Проверить тип, чтобы избежать в будущем передачи ответа
// в виде документа в формате HTML
if (type.index0f("xml") !== -1 && request.responseXML)
callback(request.responseXML); // Объект XML
else
if (type === "application/json")
callback(JSON.parse(request.responseText)); // Объект JSON
else
callback(request.responseText); // Строка
}
};
request.send(null); // Отправить запрос
}
Функция в примере 18.3 проверяет заголовок «Content-Type» ответа и обрабатывает ответы типа «application/json» особым образом. Другими типами ответов, которые может потребоваться «декодировать» особо, являются «application/Java-Script» и «text/JavaScript». С помощью объекта XMLHttpRequest
можно запрашивать сценарии на языке JavaScript и затем выполнять их с помощью глобальной функции eval()
(раздел 4.12.2). Однако в этом нет никакой необходимости, потому что возможностей самого элемента <script>
вполне достаточно, чтобы загрузить и выполнить сценарий. Вернитесь к примеру 13.4, держа в уме, что элемент <script>
может выполнять HTTP-запросы к другим серверам, запрещенные в прикладном интерфейсе XMLHttpRequest
.
В ответ на HTTP-запросы веб-серверы часто возвращают двоичные данные (например, файлы изображений). Свойство responseText
предназначено только для текстовых данных и не позволяет корректно обрабатывать ответы с двоичными данными, даже если использовать метод charCodeAt()
полученной строки. Спецификация «ХНН2» определяет способ обработки ответов с двоичными данными, но на момент написания этих строк производители броузеров еще не реализовали его. Дополнительные подробности приводятся в разделе 22.6.2.
Для корректного декодирования ответа сервера необходимо, чтобы сервер отправлял заголовок «Content-Type» с правильным значением MIME-типа ответа. Если, к примеру, сервер отправит XML-документ, не указав соответствующий MIME-тип, объект XMLHttpRequest
не произведет синтаксический анализ ответа и не установит значение свойства responseXML
. Или, если сервер укажет неправильное значение в параметре «charset» заголовка «Content-Type», объект XMLHttpRequest
декодирует ответ с использованием неправильной кодировки и в свойстве responseText
могут оказаться ошибочные символы.
Спецификация «ХНН2» определяет метод overrideMimeType(),
предназначенный для решения этой проблемы, и он уже реализован в некоторых броузерах. Если необходимо определить MIME-тип, лучше подходящий для веб-приложения, чем возвращаемый сервером, можно перед вызовом метода send()
передать методу overrideMimeType()
свой тип - это заставит объект XMLHttpRequest
проигнорировать заголовок «Content-Type» и использовать указанный тип. Предположим, что необходимо загрузить XML-файл, который планируется интерпретировать как простой текст. В этом случае можно воспользоваться методом overrideMimeType(),
чтобы сообщить объекту XMLHttpRequest
, что он не должен выполнять синтаксический анализ файла и преобразовывать его в объект XML-документа:
// Не обрабатывать ответ, как XML-документ
request.overrideMimeType("text/plain; charset=utf-8")
- 18.1.2. Получение ответа
- Код, кодирование и декодирование
- Грамотная визуальная организация электронного ответа
- Скорость реакции и ответа
- Достоверность ответа
- Общий алгоритм ответа на агрессивное письмо клиента
- 8.8. Проверка полученного ответа
- Три ответа
- 14.4.3. Формирование ответа на вопрос "как"
- Нет ответа ни на один вопрос
- 12.16.3 Секция ответа
- 13.9.2 Декодирование наиболее общих команд