Книга: JavaScript. Подробное руководство, 6-е издание
18.1.1. Выполнение запроса
Разделы на этой странице:
18.1.1. Выполнение запроса
Следующий этап после создания объекта XMLHttpRequest
- определение параметров HTTP-запроса вызовом метода ореn()
объекта XMLHttpRequest, которому передаются две обязательные части запроса: метод и URL:
request.open("GET". // Запрос типа HTTP GET
"data.csv"); // на получение содержимого по этому URL-адресу
Первый аргумент метода open()
определяет HTTP-метод или операцию. Это строка, не чувствительная к регистру, но обычно содержащая только символы верхнего регистра, в соответствии со спецификацией протокола HTTP. Методы «GET» и «POST» поддерживаются всеми броузерами. Метод «GET» используется для «обычных» запросов и соответствует случаю, когда URL-адрес полностью определяет запрашиваемый ресурс. Он используется, когда запрос не имеет побочных эффектов и когда ответ сервера можно поместить в кэш. Метод «POST» обычно используется HTML-формами. Он включает в тело запроса дополнительные данные (данные формы), и эти данные часто сохраняются в базе данных на стороне сервера (побочный эффект). В ответ на повторяющиеся запросы POST к одному и тому же URL сервер может возвращать разные ответы, и ответы на запросы, отправленные этим методом, не должны помещаться в кэш.
Помимо запросов «GET» и «POST», спецификация XMLHttpRequest
также позволяет передавать методу open()
строки «DELETE», «HEAD», «OPTIONS» и «PUT» в первом аргументе. (Методы «HTTP CONNECT», «TRACE» и «TRACK» явно запрещены к использованию из-за проблем с безопасностью.) Старые версии броузеров могут не поддерживать все эти методы, но метод «HEAD», по крайней мере, поддерживается почти всеми броузерами, и его использование демонстрируется в примере 18.13.
Вторым аргументом методу open()
передается URL-адрес запрашиваемого ресурса. Это относительный URL-адрес документа, содержащего сценарий, в котором вызывается метод open().
Если указать абсолютный адрес, то в общем случае протокол, доменное имя и порт должны совпадать с аналогичными параметрами адреса документа: нарушение политики общего происхождения обычно вызывает ошибку. (Однако спецификация «XMLHttpRequest Level 2» допускает выполнение запросов к другим серверам, если сервер явно разрешил это - смотрите раздел 18.1.6.)
Следующий этап в выполнении запроса - установка заголовков запроса, если это необходимо. Запросы POST, например, требуют, чтобы был определен заголовок «Content-Type», определяющий MIME-тип тела запроса:
request.setRequestHeader("Content-Type", "text/plain");
Если вызвать метод setRequestHeader()
несколько раз с одним и тем же заголовком, новое значение не заменит прежнее: вместо этого в HTTP-запрос будет вставлено несколько копий заголовка или один заголовок с несколькими значениями.
Нельзя определять собственные заголовки «Content-Length», «Date», «Referer» и «User-Agent»: объект XMLHttpRequest
добавляет их автоматически и не позволяет подделывать их. Аналогично объект XMLHttpRequest
автоматически обрабатывает cookies и срок поддержки открытого соединения, определяет кодировку символов и выполняет кодирование сообщений, поэтому вы не должны передавать методу setRequestHeader()
следующие заголовки:
Accept-Charset Content-Transfer-Encoding ТЕ
Accept-Encoding Date Trailer
Connection Expect Transfer-Encoding
Content-Length Host Upgrade
Cookie Keep-Alive User-Agent
Cookie2 Referer Via
В запросе можно определить заголовок «Authorization», но обычно в этом нет необходимости. При выполнении запроса к ресурсу, защищенному паролем, передайте имя пользователя и пароль методу open()
в четвертом и пятом аргументах, а объект XMLHttpRequest
автоматически установит соответствующие заголовки. (О третьем необязательном аргументе метода open()
рассказывается ниже, а описание аргументов, в которых передаются имя пользователя и пароль, можно найти в справочной части книги.)
Последний этап в процедуре выполнения HTTP-запроса с помощью объекта XMLHttpRequest
- передача необязательного тела запроса и отправка его серверу. Делается это с помощью метода send():
request.send(null);
GET-запросы не имеют тела, и в этом случае можно передать методу значение null или вообще опустить аргумент. POST-запросы обычно имеют тело, и оно должно соответствовать заголовку «Content-Type», установленному с помощью метода setRequestHeader()
.
Пример 18.1 демонстрирует использование всех методов объекта XMLHttpRequest
, описанных выше. Он отправляет серверу текстовую строку методом POST и игнорирует ответ, возвращаемый сервером.
Пример 18.1. Отправка простого текста на сервер методом POST
function postMessage(msg) {
var request = new XMLHttpRequest(); // Новый запрос
request.open("POST", "/log.php"); // серверному сценарию методом POST
// Отправить простое текстовое сообщение в теле запроса
request.setRequestHeader("Content-Type", // Тело запроса - простой текст
"text/plain;charset=UTF-8");
request.send(msg); // msg как тело запроса
// Запрос выполнен. Мы игнорируем возможный ответ или ошибку.
}
Обратите внимание, что вызов метода send()
в примере 18.1 инициирует запрос и затем возвращает управление: он не блокируется в ожидании ответа от сервера. HTTP-ответы практически всегда обрабатываются асинхронно, как будет показано в следующем разделе.
Порядок имеет значение
Части HTTP-запроса следуют в определенном порядке: метод запроса и URL-адрес должны определяться в первую очередь, затем должны устанавливаться заголовки запроса и, наконец, тело запроса. Обычно реализации XMLHttpRequest
ничего не отправляют в сеть, пока не будет вызван метод send().
Но прикладной интерфейс XMLHttpRequest
спроектирован так, как если бы каждый метод немедленно отправлял данные в сеть. Это означает, что методы объекта XMLHttpRequest
должны вызываться в порядке, соответствующем структуре HTTP-запроса. Например, метод setRequestHeader()
должен вызываться после метода open()
и перед методом send(),
в противном случае он возбудит исключение.
******************************************
- 12.16.2 Секция запроса
- Выполнение XSLT-преобразований в Java
- Выполнение поискового запроса
- Выполнение вычислений в запросах
- Выполнение команды
- 8.4.5. Выполнение внешних команд
- Выполнение макросов
- Практическая работа 46. Выполнение расчетов с использованием Мастера функций
- Основные сведения о запросах
- Двусмысленность в запросах JOIN
- 9.4.2. Регистрация времени, потраченного на выполнение задания
- 15.3.2. Установка контрольных точек, пошаговое выполнение и отслеживаемые точки