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

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

Жанры

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

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

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

find=pizza&zipcode=02134&radius=1km

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

application/x-www-form-urlencoded

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

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

{

find: "pizza", zipcode: 02134, radius: "1km"

}

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

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

/**

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

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

function encodeFormData(data) {

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

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

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

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

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

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

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

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

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

}

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

}

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

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

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

function postData(url, data, callback) {

var request = new XMLHttpRequest;

request.open("POST", url); // Методом POST на указ, url

request.onreadystatechange = function { // Простой обработчик

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

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

};

request.setRequestHeader("Content-Type", // Установить "Content-Type"

"application/x-www-form-urlencoded");

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

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

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

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

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

function getData(url, data, callback) {

var request = new XMLHttpRequest;

request.open("GET", url + // Методом GET на указанный url

"?" + encodeFormData(data)); // с добавлением данных

request.onreadystatechange = function { // Простой обработчик событий

if (request.readyState === 4 && callback) callback(request);

};

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

}

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

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

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

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

Группа крови на рукаве

Вязовский Алексей
1. ГК
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.40
рейтинг книги
Группа крови на рукаве

На границе империй. Том 8

INDIGO
12. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8

Личный аптекарь императора

Карелин Сергей Витальевич
1. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора

Ученик. Книга вторая

Первухин Андрей Евгеньевич
2. Ученик
Фантастика:
фэнтези
5.40
рейтинг книги
Ученик. Книга вторая

Наемный корпус

Вайс Александр
5. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Наемный корпус

S-T-I-K-S. Пройти через туман

Елисеев Алексей Станиславович
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.00
рейтинг книги
S-T-I-K-S. Пройти через туман

Лейб-хирург

Дроздов Анатолий Федорович
2. Зауряд-врач
Фантастика:
альтернативная история
7.34
рейтинг книги
Лейб-хирург

Ожерелье Странника

Хаггард Генри Райдер
Приключения:
исторические приключения
7.50
рейтинг книги
Ожерелье Странника

Наследие Маозари

Панежин Евгений
1. Наследие Маозари
Фантастика:
рпг
попаданцы
аниме
5.80
рейтинг книги
Наследие Маозари

Избрание сочинения в трех томах. Том второй

Кочетов Всеволод Анисимович
Проза:
советская классическая проза
5.00
рейтинг книги
Избрание сочинения в трех томах. Том второй

Древесный маг Орловского княжества 13

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

Черный Маг Императора 20

Герда Александр
20. Черный маг императора
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 20

Стражи душ

Кас Маркус
4. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Стражи душ

Барон. Книга вторая

Первухин Андрей Евгеньевич
6. Ученик
Фантастика:
фэнтези
попаданцы
5.40
рейтинг книги
Барон. Книга вторая