JavaScript метод XMLHttpRequest.send()
Определение и применение
JavaScript метод send() объекта XMLHttpRequest позволяет отправить запрос на сервер.
Для того, чтобы отправить запрос его необходимо изначально инициализировать с использованием метода open() объекта XMLHttpRequest.
Если заголовок Accept не был установлен с помощью метода setRequestHeader() объекта XMLHttpRequest, то отправляется заголовок Accept с типом "*/* " (любой тип).
Поддержка браузерами
Спецификация: xhr.spec.whatwg
Поддерживается во всех основных браузерах с 2015 года.
| Возможность | Компьютеры | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
send | 1 | 12 | 1 | 8 | 1.2 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 | 1 |
| ArrayBufferView as parameter to send() | 22 | 12 | 20 | 11.6 | 7 | 25 | 20 | 12 | 7 | 1.5 | 4.4 | 7 |
| ArrayBuffer as parameter to send() | 9 | 12 | 9 | 11.6 | 6 | 18 | 9 | 12 | 6 | 1.0 | 4.4 | 6 |
| Blob as parameter to send() | 22 | 12 | 2 | 12 | 6 | 25 | 4 | 12 | 6 | 1.5 | 4.4 | 6 |
| FormData as parameter to send() | 6 | 12 | 2 | 12 | 6 | 18 | 4 | 12 | 6 | 1.0 | 4.4 | 6 |
| URLSearchParams as parameter to send() | 59 | 17 | 44 | 46 | 15 15 10.1 — Удалено в 15; Частичная поддержка Примечание MDN (англ.) Doesn't send the correct | 59 | 44 | 43 | 15 15 10.3 — Удалено в 15; Частичная поддержка Примечание MDN (англ.) Doesn't send the correct | 7.0 | 59 | 15 15 10.3 — Удалено в 15; Частичная поддержка Примечание MDN (англ.) Doesn't send the correct |
поддерживается с ограничениями нет поддержки нет данных≤31 — не позднее версии 31
JavaScript синтаксис:
XMLHttpRequest.send();
XMLHttpRequest.send(body);
body - Any
Cпецификация
XMLHttpRequestЗначения параметров
| Параметр | Описание |
|---|---|
| body | Представляет из себя тело данных для отправки в запросе XHR. Если метод запроса соответствует значению "GET" или "HEAD", то этот параметр игнорируется и тело запроса имеет значение null. Необязательный параметр. |
Исключения
| Тип исключения | Описание |
|---|---|
| InvalidStateError | Возникает в том случае, если метод send() уже был вызван для запроса, и / или запрос завершен. |
| NetworkError | Возникает в том случае, если тип ресурса, который нужно извлечь, является Blob, и метод не соответствует типу "GET". |
Пример использования
В следующем примере мы рассмотрим с вами как отправить "GET" запрос с использованием метода send() объекта XMLHttpRequest.
<html>
<head>
<title>Использование JavaScript методов open() и send() объекта XMLHttpRequest</title>
</head>
<body>
<button onclick="getPhone()">Запросить телефон</button>
<!-- добавляем атрибут событий onclick -->
<div id="demo"></div>
<script>
function getPhone() {
let xhr = new XMLHttpRequest(); // инициализируем переменную новым объектом XMLHttpRequest
xhr.open("GET", "user-profile.json"); // определяем параметры для запроса
xhr.send(); // отправляем запрос на сервер
xhr.onreadystatechange = function () {
// проверяем состояние запроса и числовой код состояния HTTP ответа
if (this.readyState == 4 && this.status == 200) {
const data = JSON.parse(this.responseText); // анализируем строку в формате JSON и инициализируем переменную значением, полученным в ходе анализа
document.getElementById("demo").innerHTML = "Телефон пользователя: " + data.phone; // находим элемент по id и изменяем его содержимое значением ключа объекта, содержащегося в переменной
}
};
}
</script>
</body>
</html>
В этом примере с использованием атрибута событий onclick при нажатии на кнопку (HTML элемент <button>) вызываем функцию getPhone, которая:
- Вызывает конструктор объекта XMLHttpRequest и инициализирует переменную новым объектом этого типа.
- С помощью метода open() объекта XMLHttpRequest определяем параметры для запроса - указываем, что HTTP запрос будет осуществлен методом "GET", а в качестве URL адреса на который будет отправлен запрос мы задаем файл формата json. Обратите внимание, что файл размещен на том же сервере и в том же каталоге, что и документ с которого выполняется скрипт. Файл имеет следующий вид:
Код
{ "firstName": "Василий", "lastName": "Джейсонов", "age": 25, "phone": 88005553535 } - С помощью метода send() объекта XMLHttpRequest отправляем запрос на сервер.
- С использованием обработчика событий onreadystatechange, вызываемого при запуске события readystatechange, то есть при каждом изменении свойства readyState объекта XMLHttpRequest мы вызываем функцию, которая проверяет состояние запроса, оно должно соответствовать значению 4 (операция полностью завершена) и числовой код состояния HTTP ответа должен соответствовать значению 200 (успешный запрос). Если условия выполнены, то с использованием метода JSON.parse() анализируем строку в формате JSON и инициализируем переменную значением, полученным в ходе анализа. После этого с помощью метода getElementById() находим элемент с определенным глобальным атрибутом id и изменяем его содержимое значением ключа объекта, содержащегося в инициализированной ранее переменной.
Пример использования методов open() и send() объекта XMLHttpRequest
Исходный код для изучения. Запуск на этой странице недоступен.
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");
Результат нашего примера:
В следующем примере мы рассмотрим с вами как отправить "POST" запрос с использованием метода send() объекта XMLHttpRequest.
<html>
<head>
<title
>Использование JavaScript методов send() и setRequestHeader() объекта XMLHttpRequest</title
>
</head>
<body>
<form onsubmit="logIn(event)">
<input type="text" name="user" placeholder="user" />
<input type="password" name="pwd" placeholder="password" />
<button type="submit">Log In</button>
<!-- добавляем атрибут событий onsubmit -->
</form>
<div id="demo"></div>
<script>
function logIn(e) {
e.preventDefault(); // отменяем действие события по умолчанию
let userVal = document.querySelector("[type='text']").value, // инициализируем переменную содержащую значение элемента с определенным id
pwdVal = document.querySelector("[type='password']").value, // инициализируем переменную содержащую значение элемента с определенным id
data = "user=" + userVal + "&password=" + pwdVal, // инициализируем переменную строковым значением, которое мы будем отправлять на сервер в качестве тела данных в запросе
xhr = new XMLHttpRequest(); // инициализируем переменную новым объектом XMLHttpRequest
xhr.open("POST", "login-demo"); // определяем параметры для запроса
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); // задаем значение заголовка HTTP запроса (указываем, что передаваемое значение на сервер кодируется в кортежах с ключом, разделенных символоми '&', с '=' между ключом и значением)
xhr.send(data); // отправляем запрос на сервер
xhr.onreadystatechange = function () {
// проверяем состояние запроса и числовой код состояния HTTP ответа
if (this.readyState == 4 && this.status == 200) {
document.getElementById("demo").innerHTML = this.responseText; // находим элемент по id и изменяем его содержимое значением содержащим ответ сервера на запрос в виде текста
}
};
}
</script>
</body>
</html>
В этом примере с использованием атрибута событий onsubmit, установленного на форму (HTML элемент <form>) при нажатии на кнопку (HTML элемент <button>) вызываем функцию logIn(), которой мы передаем объект события (объект Event) и она в свою очередь:
- С помощью метода preventDefault() объекта Event отменяет действие события по умолчанию. Это необходимо для того, чтобы избежать перезагрузки страницы во время отправки формы.
- Инициализирует четыре переменные: первая и вторая содержат значения полей <input>, третья содержит строковое значение, которое мы будем отправлять на сервер в качестве тела данных в запросе (состоит в том числе из первых двух переменных), четвертая вызывает конструктор объекта XMLHttpRequest и инициализирует переменную новым объектом этого типа.
- С помощью метода open() объекта XMLHttpRequest определяем параметры для запроса - указываем, что HTTP запрос будет осуществлен методом "POST", а в качестве URL адреса на который будет отправлен запрос мы задаем файл формата php. Обратите внимание, что файл размещен на том же сервере и в том же каталоге, что и документ с которого выполняется скрипт. Файл содержит следующий простой скрипт на языке программирования 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).
Учебный POST-запрос: без авторизации и сохранения данных
Исходный код для изучения. Запуск на этой странице недоступен.
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);
Результат нашего примера: