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

<b>      else</b>

<b>        if (type === &quot;application/json&quot;)</b>

<b>          callback(JSON.parse(request.responseText)); // Объект JSON</b>

<b>        else</b>

<b>          callback(request.responseText); // Строка</b>

<b>    }</b>

<b>  };</b>

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

<b>}</b>

Функция в примере 18.3 проверяет заголовок «Content-Type» ответа и обрабатывает ответы типа «application/json» особым образом. Другими типами ответов, которые может потребоваться «декодировать» особо, являются «application/Java-Script» и «text/JavaScript». С помощью объекта

<b>XMLHttpRequest</b>
можно запрашивать сценарии на языке JavaScript и затем выполнять их с помощью глобальной функции
<b>eval()</b>
(раздел 4.12.2). Однако в этом нет никакой необходимости, потому что возможностей самого элемента
<b>&lt;script&gt;</b>
вполне достаточно, чтобы загрузить и выполнить сценарий. Вернитесь к примеру 13.4, держа в уме, что элемент
<b>&lt;script&gt;</b>
может выполнять HTTP-запросы к другим серверам, запрещенные в прикладном интерфейсе
<b>XMLHttpRequest</b>
.

В ответ на HTTP-запросы веб-серверы часто возвращают двоичные данные (например, файлы изображений). Свойство

<b>responseText</b>
предназначено только для текстовых данных и не позволяет корректно обрабатывать ответы с двоичными данными, даже если использовать метод
<b>charCodeAt()</b>
полученной строки. Спецификация «ХНН2» определяет способ обработки ответов с двоичными данными, но на момент написания этих строк производители броузеров еще не реализовали его. Дополнительные подробности приводятся в разделе 22.6.2.

Для корректного декодирования ответа сервера необходимо, чтобы сервер отправлял заголовок «Content-Type» с правильным значением MIME-типа ответа. Если, к примеру, сервер отправит XML-документ, не указав соответствующий MIME-тип, объект

<b>XMLHttpRequest</b>
не произведет синтаксический анализ ответа и не установит значение свойства
<b>responseXML</b>
. Или, если сервер укажет неправильное значение в параметре «charset» заголовка «Content-Type», объект
<b>XMLHttpRequest</b>
декодирует ответ с использованием неправильной кодировки и в свойстве
<b>responseText</b>
могут оказаться ошибочные символы.

Спецификация «ХНН2» определяет метод

<b>overrideMimeType(),</b>
предназначенный для решения этой проблемы, и он уже реализован в некоторых броузерах. Если необходимо определить MIME-тип, лучше подходящий для веб-приложения, чем возвращаемый сервером, можно перед вызовом метода
<b>send()</b>
передать методу
<b>overrideMimeType()</b>
свой тип - это заставит объект
<b>XMLHttpRequest</b>
проигнорировать заголовок «Content-Type» и использовать указанный тип. Предположим, что необходимо загрузить XML-файл, который планируется интерпретировать как простой текст. В этом случае можно воспользоваться методом
<b>overrideMimeType(),</b>
чтобы сообщить объекту
<b>XMLHttpRequest</b>
, что он не должен выполнять синтаксический анализ файла и преобразовывать его в объект XML-документа:

<b>// Не обрабатывать ответ, как XML-документ</b>

<b>request.overrideMimeType(&quot;text/plain; charset=utf-8&quot;)</b>

18.1.3. Оформление тела запроса

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

18.1.3.1. Запросы с данными в формате HTML-форм

Рассмотрим HTML-формы. Когда пользователь отправляет форму, данные в форме (имена и значения всех элементов формы) помещаются в строку и отправляются вместе с запросом. По умолчанию HTML-формы отправляются на сервер методом POST, и данные формы помещаются в тело запроса. Схема преобразования данных формы в строку относительно проста: к имени и значению каждого элемента формы применяется обычное URI-кодирование (замена специальных символов шестнадцатеричными кодами), кодированные представления имен и значений отделяются знаком равенства, а пары имя/значение - амперсандом. Представление простой формы в виде строки может выглядеть, как показано ниже:

<b>find=pizza&amp;zipcode=02134&amp;radius=1km</b>

Такой формат представления данных формы соответствует формальному MIME-типу:

<b>application/x-www-form-urlencoded</b>

Этот тип следует указать в заголовке «Content-Type» запроса при отправке данных такого вида в составе запроса методом POST.

Обратите внимание, что для использования такого формата представления не требуется наличие HTML-формы, и в действительности в этой главе мы не будем работать с формами непосредственно. В Ajax-приложениях чаще всего у вас будет иметься некоторый JavaScript-объект, который необходимо отправить на сервер. (Этот объект может быть создан из полей ввода HTML-формы, но в данном случае это не имеет значения.) Данные, показанные выше, могут оказаться представлением следующего JavaScript-объекта:

<b>{</b>

<b>find: &quot;pizza&quot;, zipcode: 02134, radius: &quot;1km&quot;</b>

<b>}</b>

Формат представления данных форм настолько широко используется во Всемирной паутине и настолько хорошо поддерживается всеми языками программирования для создания серверных сценариев, что его применение для представления данных, никак не связанных с формами, часто оказывается наиболее простым и удобным. Пример 18.4 демонстрирует, как преобразовать свойства объекта в формат представления формы.

Пример 18.4. Преобразование объекта в формат для отправки в НТТР-запросе

<b>/**</b>

<b>* Представляет свойства объекта, как если бы они были парами имя/значение</b>