JavaScript метод XMLHttpRequest.open()
Определение и применение
JavaScript метод open() объекта
XMLHttpRequest
позволяет инициализировать только что созданный запрос (определить параметры запроса), или повторно инициализировать
существующий запрос.
Для того, чтобы отправить инициализированный запрос на сервер, воспользуйтесь методом
send()
объекта
XMLHttpRequest.
Поддержка браузерами
Спецификация: xhr.spec.whatwg
Поддерживается во всех основных браузерах с 2015 года.
| Возможность | Компьютеры | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
open | 1 | 12 | 1 Версия 1 выпущена в 2004 г. Примечание MDN (англ.) Starting in Firefox 30, synchronous requests on the main thread have been deprecated due to their negative impact on performance and the user experience. Therefore, the | 8 | 1.2 | 18 | 4 Версия 4 выпущена в 2011 г. Примечание MDN (англ.) Starting in Firefox for Android 30, synchronous requests on the main thread have been deprecated due to their negative impact on performance and the user experience. Therefore, the | 10.1 | 1 | 1.0 | 4.4 | 1 |
поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31
JavaScript синтаксис
xhr.open(method, url);
xhr.open(method, url, async);
xhr.open(method, url, async, user);
xhr.open(method, url, async, user, password);
Спецификация
Значения параметров
| Параметр | Описание |
|---|---|
method |
Метод HTTP запроса, который будет использован. Например, "GET", "POST",
"PUT", "DELETE" и так далее. Стандартные методы (get,
post и другие) приводятся к верхнему регистру. Обязательный параметр.
|
url |
URL адрес, на который будет отправлен запрос. Относительный адрес разрешается относительно базового URL документа. Обязательный параметр. |
async |
Необязательный логический параметр, который по умолчанию соответствует значению true, которое
указывает на то, что, следует выполнять операцию асинхронно.Если значение установить в false, то метод send() не возвращается до получения
ответа. Синхронные запросы в основном потоке могут быть деструктивны для работы пользователя и их следует
избегать. Синхронный XHR в основном потоке устарел и ограничен; он блокирует интерфейс.
Используйте асинхронный запрос. Синхронные запросы допустимы в воркерах (англ. Web Workers,
скрипты в фоновом потоке).
|
user |
Имя пользователя, используемое для HTTP-аутентификации. По умолчанию это значение соответствует
null.
Необязательный параметр.
|
password |
Пароль, используемый для аутентификации. По умолчанию это значение соответствует null.
Необязательный параметр.
|
Исключения
| Тип исключения | Описание |
|---|---|
SyntaxError |
Возникает, если method не является допустимым именем HTTP-метода или url не удается
разобрать.
|
SecurityError |
Возникает при запрещенном методе: CONNECT, TRACE или TRACK. |
InvalidAccessError |
Возникает при синхронном запросе (async равен false) в документе, если ранее задано
ненулевое значение timeout или значение responseType, отличное от пустой строки.
|
InvalidStateError |
Возникает, если документ, в котором создан объект, не является полностью активным. |
Примеры использования
В следующем примере мы рассмотрим как определить параметры для "GET" запроса.
GET-запрос JSON-файла и вывод телефона пользователя
Пример запрашивает user-profile.json у сервера. Для запуска сохраните полный HTML-документ, разместите рядом JSON-файл с полем phone и откройте страницу через HTTP-сервер. Здесь показан код; изображение ниже иллюстрирует ответ.
Исходный код для изучения. Запуск на этой странице недоступен.
index.html
<button data-migration-click-0="">Запросить телефон</button>
<div id="demo"></div>
main.js
const getPhone = function () {
let xhr = new XMLHttpRequest()
xhr.open('GET', 'user-profile.json')
xhr.send()
xhr.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
const data = JSON.parse(this.responseText)
document.getElementById('demo').innerHTML = 'Телефон пользователя: ' + data.phone
}
}
}
// Обработчики кнопок перенесены из HTML для запуска с CSP без inline-скриптов.
document.querySelector('[data-migration-click-0]').addEventListener('click', function () {
getPhone()
})
document.querySelector('[data-migration-click-0]').removeAttribute('data-migration-click-0')
Результат нашего примера:
В этом примере с использованием метода
addEventListener()
при нажатии на кнопку (HTML элемент
<button>) вызываем функцию getPhone, которая:
-
Вызывает конструктор объекта
XMLHttpRequestи инициализирует переменную новым объектом этого типа. -
С помощью метода
open()объектаXMLHttpRequestопределяем параметры для запроса - указываем, что HTTP запрос будет осуществлен методом "GET", а в качестве URL адреса, на который будет отправлен запрос, мы задаем файл формата JSON. Файл размещен на том же сервере и в том же каталоге, что и документ, с которого выполняется скрипт. Файл имеет следующий вид:JSON{ "firstName": "Василий", "lastName": "Джейсонов", "age": 25, "phone": 88005553535 } -
С помощью метода
send()объектаXMLHttpRequestотправляем запрос на сервер. -
С использованием обработчика событий
onreadystatechange, вызываемого при запуске событияreadystatechange, то есть при каждом изменении свойстваreadyStateобъектаXMLHttpRequestмы вызываем функцию, которая проверяет состояние запроса, оно должно соответствовать значению4(операция полностью завершена) и числовой код состояния HTTP ответа должен соответствовать значению200(успешный запрос). Если условия выполнены, то с использованием методаJSON.parse()анализируем строку в форматеJSONи инициализируем переменную значением, полученным в ходе анализа. После этого с помощью методаgetElementById()находим элемент с определенным глобальным атрибутомidи изменяем его содержимое значением ключа объекта, содержащегося в инициализированной ранее переменной.
В следующем примере мы рассмотрим как определить параметры для "POST" запроса.
Учебный POST-запрос: без авторизации и сохранения данных
Пример отправляет данные формы методом POST. Замените условный адрес login-demo адресом своего обработчика и откройте полный HTML-документ через HTTP-сервер. Здесь показан код отправки; серверный обработчик в пример не входит.
Исходный код для изучения. Запуск на этой странице недоступен.
index.html
<form>
<input type="text" name="user" placeholder="user" />
<input type="password" name="pwd" placeholder="password" />
<button type="submit">Log In</button>
</form>
<div id="demo"></div>
main.js
const logIn = function (e) {
e.preventDefault()
let userVal = document.querySelector("[type='text']").value,
pwdVal = document.querySelector("[type='password']").value,
data = 'user=' + userVal + '&password=' + pwdVal,
xhr = new XMLHttpRequest()
xhr.open('POST', 'login-demo')
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
xhr.send(data)
xhr.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
document.getElementById('demo').innerHTML = this.responseText
}
}
}
document.querySelector('form').addEventListener('submit', logIn)
В этом примере с использованием обработчика события submit, зарегистрированного через
addEventListener(), установленного на форму (HTML элемент
<form>) при нажатии на кнопку (HTML элемент
<button>) вызываем функцию logIn(), которой мы передаем объект события (объект
Event) и она в свою очередь:
-
С помощью метода
preventDefault()объектаEventотменяет действие события по умолчанию. Это необходимо для того, чтобы избежать перезагрузки страницы во время отправки формы. -
Инициализирует четыре переменные: первая и вторая содержат значения полей
<input>, третья содержит строковое значение, которое мы будем отправлять на сервер в качестве тела данных в запросе (состоит в том числе из первых двух переменных), четвертая вызывает конструктор объектаXMLHttpRequestи инициализирует переменную новым объектом этого типа. -
С помощью метода
open()объектаXMLHttpRequestопределяем параметры для запроса - указываем, что HTTP запрос будет осуществлен методом "POST", а в качестве URL адреса, на который будет отправлен запрос, задаем условный адресlogin-demoна том же сервере. Такой адрес мог бы обрабатывать, например, следующий учебный скрипт на языке программирования PHP:Код<?php $user = $_POST['user']; // инициализируем переменную user, которая содержит переданные скрипту через HTTP метод POST данные (с ключом user) $password = $_POST['password']; // инициализируем переменную password, которая содержит переданные скрипту через HTTP метод POST данные (с ключом password) if($user == "agent" && $password == "007") { // проверяем соответствуют ли значения в переменных определенным значениям echo "Пользователь ".$user." с паролем ".$password." успешно залогинен"; // выводим текстовое содержимое со значением переменных } else { echo "Пользователь ".$user." или пароль ".$password." ошибочны"; // выводим текстовое содержимое со значением переменных } ?> -
С помощью метода
setRequestHeader()объектаXMLHttpRequestзадаем значение заголовка HTTP запроса (указываем, что передаваемое значение на сервер кодируется в кортежах с ключом, разделенных символами'&', с'='между ключом и значением). -
С помощью метода
send()объектаXMLHttpRequestотправляем запрос на сервер. В качестве параметра метода передаем переменную, которая содержит сформированное выше строковое значение. -
С использованием обработчика событий
onreadystatechange, вызываемого при запуске событияreadystatechange, то есть при каждом изменении свойстваreadyStateобъектаXMLHttpRequestмы вызываем функцию, которая проверяет состояние запроса, оно должно соответствовать значению4(операция полностью завершена) и числовой код состояния HTTP ответа должен соответствовать значению200(успешный запрос). Если условия выполнены, то с помощью методаgetElementById()находим элемент с определенным глобальным атрибутомidи изменяем его содержимое значением, содержащим ответ сервера на запрос в виде текста (значение свойстваresponseText).