HTML_формы по умолчанию отправляются на сервер методом POST. При выпол_ нении запроса POST данные передаются на сервер в теле запроса, а не в строке URL_адреса. Поскольку параметры запроса в методе GET приходится вставлять в URL, метод GET пригоден только для случаев, когда запрос не вызывает побоч_ ных эффектов на стороне сервера, т, е. когда повторные запросы GET с тем же са_ мым URL_адресом и с теми же параметрами приводят к получению тех же самых результатов. Если запрос сопровождается побочными эффектами (например, сервер сохраняет некоторые из параметров в базе данных), должен использо_ ваться запрос POST.
Пример 20.5 демонстрирует порядок выполнения запросов POST с помощью объекта XMLHttpRequest. Метод HTTP.post() вызывает функцию HTTP.encodeForm_ Data() для преобразования свойств объекта в строковую форму, которая может использоваться в качестве тела запроса POST. Затем полученная строка передает_ ся методу XMLHttpRequest.send() и становится телом запроса. (Кроме того, строка, созданная с помощью функции HTTP.encodeFormData(), может добавляться в URL_ адрес метода GET; достаточно лишь отделить URL_адрес и данные символом во_ просительного знака.) Помимо этого в примере 20.5 используется метод HTTP._getResponse(). Данный метод анализирует ответ сервера на основе его типа. Реализация этого метода приводится в следующем разделе.
Пример 20.5. Вспомогательная функция HTTP.post()
/**
* Отправляет HTTP_запрос POST по указанному URL_адресу,
* используя имена и значения свойств объекта в качестве тела запроса.
* Анализирует ответ сервера на основе его типа и передает
* полученное значение функции обратного вызова.
* В случае появления HTTP_ошибки вызывает заданную
* функцию errorHandler или передает значение null
* функции обратного вызова, если обработчик ошибок не определен.
// Объединить все пары в строку, разделяя их символами & return pairs.join('&');
};
Еще один вариант выполнения запроса POST с помощью объекта XMLHttpRequest приводится в примере 21.14. Код в этом примере вызывает веб_службу, но вме_ сто значений элементов формы в теле запроса передает XML_документ.