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

<b>  request.send(JS0N.stringify(data));</b>

<b>}</b>

18.1.3.3. Запросы с данными в формате XML

Иногда для представления передаваемых данных также используется формат XML. Данные в запросе информации о пиццерии можно было бы передавать не в формате представления данных форм и не в формате JSON представления JavaScript-объектов, а в формате XML-документа. Тело такого запроса могло бы иметь следующий вид:

<b>&lt;query&gt;</b>

<b>  &lt;find zipcode=&quot;02134&quot; radius=&quot;1km&quot;&gt; pizza &lt;/find&gt;</b>

<b>&lt;/query&gt;</b>

Во всех примерах, встречавшихся до сих пор, аргументом метода

<b>send()</b>
объекта
<b>XMLHttpRequest</b>
была строка или значение null. В действительности же этому методу можно также передать объект Document XML-документа. Пример 18.8 демонстрирует, как создать объект
<b>Document</b>
простого XML-документа и использовать его в качестве тела НТТР-запроса.

Пример 18.8. Выполнение запроса HTTP POST с XML-документом в качестве тела

<b>// Параметры поиска &quot;что&quot;, &quot;где&quot; и &quot;радиус&quot; оформляются в виде XML-документа // и отправляются по указанному URL-адресу. При получении ответа вызывает // указанную функцию</b>

<b>function post()uery(url, what, where, radius, callback) {</b>

<b>  var request = new XMLHttpRequest();</b>

<b>  request.open(&quot;POST&quot;, url); // Методом POST на указанный url</b>

<b>  request.onreadystatechange = function() { // Простой обработчик</b>

<b>    if (request.readyState === 4 &amp;&amp; callback) callback(request);</b>

<b>  };</b>

<b>  // Создать XML-документ с корневым элементом &lt;query&gt;</b>

<b>  var doc = document.implementation.createDocument(&quot;&quot;, &quot;query&quot;, null);</b>

<b>  var query = doc.documentElement; // Элемент &lt;query&gt;</b>

<b>  var find = doc.createElement(&quot;find&quot;); // Создать элемент &lt;find&gt;</b>

<b>  query.appendChild(find); // И добавить в &lt;query&gt;</b>

<b>  find.setAttribute(&quot;zipcode&quot;, where); // Атрибуты &lt;find&gt;</b>

<b>  find.setAttribute(&quot;radius”, radius);</b>

<b>  find.appendChild(doc.createTextNode(what)); // И содержимое &lt;find&gt;</b>

<b>  // Отправить данные в формате XML серверу.</b>

<b>  // Обратите внимание, что заголовок Content-Type будет установлен автоматически, </b>

<b>  request.send(doc);</b>

<b>}</b>

Обратите внимание, что пример 18.8 не устанавливает заголовок «Content-Type» запроса. Когда методу

<b>send()</b>
передается XML-документ, то объект
<b>XMLHttpRequest</b>
автоматически установит соответствующий заголовок «Content-Type», если он не был установлен предварительно. Аналогично, если передать методу
<b>send()</b>
простую строку и не установить заголовок «Content-Type», объект
<b>XMLHttpRequest</b>
автоматически добавит этот заголовок со значением «text/plain; charset=UTF-8». Программный код в примере 18.1 явно устанавливает этот заголовок, но в действительности для данных в простом текстовом виде этого не требуется.

18.1.3.4. Выгрузка файлов

Одна из особенностей HTML-форм заключается в том, что, если пользователь выберет файл с помощью элемента

<b>&lt;input type=&quot;file&quot;&gt;</b>
, форма отправит содержимое этого файла в теле POST-запроса. HTML-формы всегда позволяли выгружать файлы, но до недавнего времени эта операция была недоступна в прикладном интерфейсе
<b>XMLHttpRequest</b>
. Прикладной интерфейс, определяемый спецификацией «ХНН2», позволяет выгружать файлы за счет передачи объекта
<b>File</b>
методу
<b>send().</b>

В данном случае нельзя создать объект с помощью конструктора

<b>File():</b>
сценарий может лишь получить объект
<b>File</b>
, представляющий файл, выбранный пользователем. В броузерах, поддерживающих объекты
<b>File</b>
, каждый элемент
<b>&lt;input type=&quot;file&quot;&gt;</b>
имеет свойство
<b>files</b>
, которое ссылается на объект, подобный массиву, хранящий объекты
<b>File</b>
. Прикладной интерфейс буксировки (drag-and-drop) (раздел 17.7) также позволяет получить доступ к файлам, «сбрасываемым» пользователем на элемент, через свойство
<b>dataTransfer.files</b>
события «drop». Поближе с объектом
<b>File</b>
мы познакомимся в разделах 22.6 и 22.7. А пока будем рассматривать объект
<b>File</b>
как полностью непрозрачное представление выбранного пользователем файла, пригодное для выгрузки методом
<b>send().</b>
В примере 18.9 представлена ненавязчивая JavaScript-функция, добавляющая обработчик события «change» к указанным элементам выгрузки файлов, чтобы они автоматически отправляли содержимое любого выбранного файла методом POST на указанный адрес URL.

Пример 18.9. Выгрузка файла посредством запроса HTTP POST

<b>// Отыскивает все элементы &lt;input type=”file&quot;&gt; с атрибутом data-uploadto</b>

<b>// и регистрирует обработчик onchange, который автоматически отправляет </b>