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

<b>* HTML-формы, с использованием формата application/x-www-form-urlencoded */</b>

<b>function encodeFormData(data) {</b>

<b>  if (!data) return // Всегда возвращать строку</b>

<b>  var pairs = []; // Для пар имя/значение</b>

<b>  for(var name in data) { // Для каждого имени</b>

<b>    if (!data.hasOwnProperty(name)) continue; // Пропустить унаслед. </b>

<b>    if (typeof data[name] === &quot;function&quot;) continue;// Пропустить методы</b>

<b>    var value = data[name].toString(); // Знач, в виде строки</b>

<b>    name = encodeURIComponent(name.replace(”%20”, &quot;+”)); // Кодировать имя</b>

<b>    value = encodeURIComponent(value.replace(&quot;%20&quot;. &quot;+&quot;)); // Кодировать значение</b>

<b>    pairs.push(name + &quot;=” + value); // Сохранить пару имя/значение</b>

<b>  }</b>

<b>  return pairs.join('&amp;’); // Объединить пары знаком &amp; и вернуть</b>

<b>}</b>

С помощью этой функции

<b>encodeFormData()</b>
легко можно создавать утилиты, такие как функция
<b>postData(),</b>
представленная в примере 18.5. Обратите внимание, что для простоты эта функция
<b>postData()</b>
(и аналогичные ей функции в примерах ниже) не обрабатывает ответ сервера. При получении ответа она передает объект
<b>XMLHttpRequest</b>
целиком указанной функции обратного вызова. Эта функция обратного вызова сама должна проверять код состояния ответа и извлекать содержимое ответа.

Пример 18.5. Выполнение запроса HTTP POST с данными в формате представления форм

<b>function postData(url, data, 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) // При получении ответа</b>

<b>      callback(request); // вызвать указанную функцию</b>

<b>  };</b>

<b>  request.setRequestHeader(&quot;Content-Type&quot;, // Установить &quot;Content-Type&quot;</b>

<b>      &quot;application/x-www-form-urlencoded&quot;);</b>

<b>  request.send(encodeFormData(data)); // Отправить данные</b>

<b>} // в представлении форм</b>

Данные формы также могут быть отправлены посредством GET-запроса, и когда цель формы состоит в том, чтобы определить параметры операции чтения, метод GET лучше соответствует назначению формы, чем метод POST. GET-запросы не имеют тела, поэтому «полезный груз» с данными формы отправляется серверу в виде строки запроса в адресе URL (следующей за знаком вопроса). Утилита

<b>encodeFormData()</b>
может также пригодиться для отправки подобных GET-запросов, и пример 18.6 демонстрирует такое ее применение.

Пример 18.6. Выполнение GET-запроса с данными в формате представления форм

<b>function getData(url, data, callback) {</b>

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

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

<b>      &quot;?&quot; + encodeFormData(data)); // с добавлением данных</b>

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

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

<b>  };</b>

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

<b>}</b>

Для добавления данных в URL-адреса HTML-формы используют строки запросов, но использование объекта

<b>XMLHttpRequest</b>
дает свободу представления данных.

При наличии соответствующей поддержки на сервере наш запрос на поиск пиццерии можно оформить в виде более удобочитаемого URL-адреса, такого как показано ниже:

<a href="http://restaurantfinder.example.com/02134/1km/pizza"><b>http://restaurantfinder.example.com/02134/1km/pizza</b></a>

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

Использование формата представления данных форм в теле POST-запросов является распространенным соглашением, но не является обязательным требованием протокола HTTP. В последние годы в роли формата обмена данными во Всемирной паутине все большей популярностью пользуется формат JSON. Пример 18.7 демонстрирует, как с помощью функции

<b>JSON.stringifу()</b>
(раздел 6.9) можно сформировать тело запроса. Обратите внимание, что этот пример отличается от примера 18.5 только последними двумя строками.

Пример 18.7. Выполнение запроса HTTP POST с данными в формате JSON

<b>function postJS0N(url, data, callback) {</b>

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

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

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

<b>    if (request.readyState === 4 &amp;&amp; callback) // При получении ответа</b>

<b>      callback(request): // вызвать указанную функцию</b>

<b>  };</b>

<b>  request.setRequestHeader(&quot;Content-Type&quot;, &quot;application/json&quot;);</b>