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

на главную - закладки

Жанры

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

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.3. Оформление тела запроса

Запросы HTTP POST включают тело запроса, которое содержит данные, передаваемые клиентом серверу. В примере 18.1 тело запроса было простой текстовой строкой. Однако нередко бывает необходимо передать в HTTP-запросе более сложные данные. В этом разделе демонстрируются некоторые способы реализации отправки таких данных.

Поделиться:
Популярные книги

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Камень. Книга пятая

Минин Станислав
5. Камень
Фантастика:
боевая фантастика
6.43
рейтинг книги
Камень. Книга пятая

Адепт. Том 1. Обучение

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
9.27
рейтинг книги
Адепт. Том 1. Обучение

#Бояръ-Аниме. Газлайтер. Том 24

Володин Григорий Григорьевич
24. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 24

Прапорщик. Назад в СССР. Книга 7

Гаусс Максим
7. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прапорщик. Назад в СССР. Книга 7

Андер Арес

Грехов Тимофей
1. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Андер Арес

Сержант. Назад в СССР. Книга 4

Гаусс Максим
4. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Сержант. Назад в СССР. Книга 4

Кодекс Крови. Книга IХ

Борзых М.
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IХ

Бастард Императора. Том 12

Орлов Андрей Юрьевич
12. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 12

Кодекс Охотника XXVIII

Винокуров Юрий
28. Кодекс Охотника
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника XXVIII

Неучтенный элемент. Том 11

NikL
11. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 11

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

Я еще барон. Книга III

Дрейк Сириус
3. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще барон. Книга III

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила