ItBursa. Блок третий
Технология AJAX
Позволяет взаимодействовать с сервером: получать и отправлять информацию
AJAX расшифровывается как Asynchronous Javascript and XML — "асинхронный JavaScript и XML"
В реальности от XML там почти ничего не осталось, все пользуются JSON-ом.
Получим данные с удалённого сервера.
Для этого создаём объект запроса с типом XMLHttpRequest()
var p = new XMLHttpRequest();
Затем указываем с каким сервером нужно связаться
p.open("GET", "http://f2.smartjs.academy/list");
GET - тип запроса
Различие между GET и POST запросами
Сейчас наиболее часто используются всего два HTTP метода: GET и POST.
Само название методов подсказывает для чего их используют
GET (get - получать) следует применять для запроса данных.
POST (post - отправлять по почте) — применяем для отправки данных на сервер.
Различия между ними:
GET - безопасный, может только запросить информацию
POST - небезопасный, отправляет данные, отправка сообщений, регистрация, онлайн платежи
GET - тело запроса пустое, поэтому обрабатывается быстро
POST - в теле запроса информация, которую передаём, обрабатывается медленно
GET - передаваемые данные видны в адресной строке, данные не защищены, зато запрос можно сохранить в виде закладки
POST -
GET - ограниченный объём запроса (2 КБ примерно)
POST - можно передавать целые файлы
GET - не разрывает HTTP соединение
POST - разрывает HTTP соединение
Таким образом
- если по логике будет происходить небезопасный запрос — использую POST;
- если идемпотентность (когда при повторном обращении возвращается один и тот же результат) нежелательна — использую POST;
- если требуется передать большой объем данных или файл — использую POST;
- в остальных случаях использую GET.
Отправляем запрос
p.send();
Запрос отправился методом GET по указанному адресу. Увидеть отправку запроса можно в консоли Хрома вкладка Network фильтр XHP
Запрос этот асинхронный и выполняется не сразу.
Если сейчас ввести команду для получения текста ответа, выведет undefined
p.responseText; // должно быть undefined, хоть у меня "", ну пусть
Это потому что сервер ещё не обработал запрос
Как же тогда получить его результат?
Существует событие readystatechange, отслеживающее изменение состояния запроса
p.addEventListener("readystatechange", function() {
console.log("readystatechange", p.readyState);
});
Получаем (на самом деле нет, потому что адрес нерабочий)
readystatechange 2
readystatechange 3
readystatechange 4
А readystatechange 1 был после того как мы ввели команду p.open
readystatechange4 означает, что данные готовы
Изменим запрос/
Если p.responseText есть, пишем "+" иначе "-"
p.addEventListener("readystatechange", function() {
console.log("readystatechange", p.readyState, p.responseText? "+" : "-");
});
Видим, что "+" появляется только там, где readystatechange 3 и 4.
3 - данные начали загружаться, 4 - данные готовы.
То есть условие готовности запроса (if p.readyState === 4) или (if p.readyState === p.DONE), что равнозначно по содержанию, но позволяет обойтись без магических чисел.
Снова изменим код
p.addEventListener("readystatechange", function() {
var result = JSON.parse(p.responseText);
console.log(result);
});