hellojs.ru
Главная - Продвинутый JavaScript - AJAX и общение с сервером

AJAX и общение с сервером

Размещено в категории "Продвинутый JavaScript"
24.11.2024 / просмотров: 6 / комментариев: 0
Материалы к уроку


Ресурсы:

XMLHttpRequest
Использование XMLHttpRequest
Объект FormData
Из FormData в JSON
Заголовки HTTP
Список кодов состояния HTTP
XMLHttpRequest.readyState
Готовый калькулятор



Одним из самых наглядных примеров работы технологии ajax - это фильтры в интернет-магазинах. Активируя, к примеру, фильтр товара на странице, сама страница не обновляется, а обновляетсяя лишь часть её, контент, связанный, к примеру, с товаром.

Страница сайта делает запрос к серверу и получает часть страницы, только необходимую информацию.

За счёт этого происходит ускорение реакции интерфейса, ведь мы не перезагружаем страницу полностью, уменьшается нагрузка на сервер и экономится траффик пользователя.

Недостатки:

У пользователя должен быть обязательно включен JavaScript и стабильный интернет.

Калькулятор валют с приходящим с сервера курсом


Суть калькулятора: есть два поля, в одно из которых мы вводим числовое значение в рублях, во втором поле будет выводиться результат - числовое значение в долларах.

И мы будем сейчас рассматривать самый первый вариант технологии ajax, где будет реализация с помощью объекта XMLHttpRequest, он не столь актуален на данный момент, но с ним нужно уметь работать.

За "серверную" часть у нас будет отвечать файлик current.json, внутри него у нас задан курс валют:

Код

{
  "current": {
  "usd": 74
  }
}

Первым делом получаем данные со страницы:

Код

'use strict';

const inputRub = document.querySelector('#rub'),
  inputUsd = document.querySelector('#usd');

Вешаем обработчик события input на первое поле калькулятора (можно как вариант использовать событие change, когда инпут уходит из фокуса):

Код

'use strict';

const inputRub = document.querySelector('#rub'),
  inputUsd = document.querySelector('#usd');

inputRub.addEventListener('input', () => {

});

Далее, при срабатывании события input (когда пользователь ввел в первое поле какие-то данные), нам нужно сделать запрос на сервер, получить данные о курсе валют от него

Код

'use strict';

const inputRub = document.querySelector('#rub'),
  inputUsd = document.querySelector('#usd');

inputRub.addEventListener('input', () => {
  const request = new XMLHttpRequest();
});

Метод open позволяет собрать нам настройки, которые помогут нам для будущего запроса:

Код

'use strict';

const inputRub = document.querySelector('#rub'),
  inputUsd = document.querySelector('#usd');

inputRub.addEventListener('input', () => {
  const request = new XMLHttpRequest();

  request.open(method, url, async, login, pass);
});

Его первым аргументом будет method - метод, используемый при запросе (post, get итд)

Второй аргумент url это путь к нашему серверу, по которому делается запрос

Третий аргумент async отвечает за асинхронность (по умолчанию стоит в позиции true, но если изменить на false, то пока вам сервер не ответит на ваш запрос, весь следующий код работать не будет)

Ajax-запросы по умолчанию являются асинхронным кодом, поскольку мы посылаем на сервер запросы и совершенно не знаем, сколько времени сервер нам будет отвечать.

Последние два аргумента это логин и пароль, которые в некоторых случаях необходимы для запроса.

Заменим наши аргументы какими-то реальными данными:

Код

'use strict';

const inputRub = document.querySelector('#rub'),
  inputUsd = document.querySelector('#usd');

inputRub.addEventListener('input', () => {
  const request = new XMLHttpRequest();

  request.open('GET', url, async, login, pass);
});  

Так как нам нужно получить какую-то информацию с сервера, мы используем тип запроса get.

Так как мы работаем с локальным проектом, мы будем формировать запрос к нашему файлу current.json, при этом путь будем прописывать относительно файла index.html

Код

'use strict';

const inputRub = document.querySelector('#rub'),
  inputUsd = document.querySelector('#usd');

inputRub.addEventListener('input', () => {
  const request = new XMLHttpRequest();

  request.open('GET', 'js/current.json');
});  

Остальные три аргумента нам в данном случае не понадобятся.

В целом наш запрос настроен, осталось его немного донастроить в плане того, что нам нужно указать что именно мы отправляем, какая это информация, в чём она закодирована и т.п.

Это делается для того, чтобы сервер понимал, что именно он принимает, это json-файл, или какие-то изображения и т.п.

Для этого есть так называемые HTTP-заголовки. И нам понадобится метод, который называется setRequestHeader

Код

'use strict';

const inputRub = document.querySelector('#rub'),
  inputUsd = document.querySelector('#usd');

inputRub.addEventListener('input', () => {
  const request = new XMLHttpRequest();

  request.open('GET', 'js/current.json');
  request.setRequestHeader('Content-type', 'application/json; charset=utf-8');
});  

Вот теперь мы можем отправить запрос, для этого используется метод send

Код

'use strict';

const inputRub = document.querySelector('#rub'),
  inputUsd = document.querySelector('#usd');

inputRub.addEventListener('input', () => {
  const request = new XMLHttpRequest();

  request.open('GET', 'js/current.json');
  request.setRequestHeader('Content-type', 'application/json; charset=utf-8');
  request.send();
});  

Выше мы рассмотрели методы объекта XMLHttpRequest, но у него также есть свои свойства.

status - это свойство отражает статус нашего запроса, список кодов состояния можно посмотреть по ссылке.

statusText - текстовое описание ответа от сервера ("ОК", "Not found" и прочее)

response - ответ от сервера, то что мы должны использовать

readyState - содержит текущее состояние нашего запроса



А теперь рассмотрим события, которые относятся к объекту XMLHttpRequest

readystatechange - отслеживает статус готовности нашего запроса в данный текущий момент, мы не можем знать, через какое время нам ответит сервер и это событие следит за свойством readyState

Добавим его в наш скрипт калькулятора:

Код

'use strict';

const inputRub = document.querySelector('#rub'),
  inputUsd = document.querySelector('#usd');

inputRub.addEventListener('input', () => {
  const request = new XMLHttpRequest();

  request.open('GET', 'js/current.json');
  request.setRequestHeader('Content-type', 'application/json; charset=utf-8');
  request.send();

  request.addEventListener('readystatechange', () => {

  });
});  

Есть также событие load, оно срабатывает когда наш запрос полностью загрузился и мы получили какой-то результат.

Код

'use strict';

const inputRub = document.querySelector('#rub'),
  inputUsd = document.querySelector('#usd');

inputRub.addEventListener('input', () => {
  const request = new XMLHttpRequest();

  request.open('GET', 'js/current.json');
  request.setRequestHeader('Content-type', 'application/json; charset=utf-8');
  request.send();

  request.addEventListener('readystatechange', () => {
  if (request.readyState === 4 && request.status === 200) {
  console.log(request.response);
  }
  });
});  

Условие звучит следующим образом: если все данные пришли (статус 4) и наш запрос успешно завершился, то что-то делаем (в нашем случае просто вывели в консоль результат запроса)

Сейчас как только мы начнём вводить в первое поле цифры, в консоли мы получим ответ нашего "сервера", а именно наш объект json



Нам остаётся теперь преобразовать полученные данные в обычный объект, который мы уже сможем использовать на странице:

Код

'use strict';

const inputRub = document.querySelector('#rub'),
  inputUsd = document.querySelector('#usd');

inputRub.addEventListener('input', () => {
  const request = new XMLHttpRequest();

  request.open('GET', 'js/current.json');
  request.setRequestHeader('Content-type', 'application/json; charset=utf-8');
  request.send();

  request.addEventListener('readystatechange', () => {
  if (request.readyState === 4 && request.status === 200) {
  console.log(request.response);
  const data = JSON.parse(request.response); // теперь тут обычный объект

  inputUsd.value = +inputRub.value / data.current.usd;
  } else {
  inputUsd.value = 'Что-то пошло не так...';
  }
  });
});  

То есть мы значение, введённое пользователем разделили на значение свойства usd из объекта из переменной data.

Округлим получаемое значение до двух знаков после запятой с помощью метода toFixed

Код

'use strict';

const inputRub = document.querySelector('#rub'),
  inputUsd = document.querySelector('#usd');

inputRub.addEventListener('input', () => {
  const request = new XMLHttpRequest();

  request.open('GET', 'js/current.json');
  request.setRequestHeader('Content-type', 'application/json; charset=utf-8');
  request.send();

  request.addEventListener('readystatechange', () => {
  if (request.readyState === 4 && request.status === 200) {
  console.log(request.response);
  const data = JSON.parse(request.response); // теперь тут обычный объект

  inputUsd.value = (+inputRub.value / data.current.usd).toFixed(2);
  } else {
  inputUsd.value = 'Что-то пошло не так...';
  }
  });
});  

Но чаще всего используется не событие readystatechange, а событие load

Код

'use strict';

const inputRub = document.querySelector('#rub'),
  inputUsd = document.querySelector('#usd');

inputRub.addEventListener('input', () => {
  const request = new XMLHttpRequest();

  request.open('GET', 'js/current.json');
  request.setRequestHeader('Content-type', 'application/json; charset=utf-8');
  request.send();

  request.addEventListener('load', () => {
  if (request.status === 200) {
  console.log(request.response);
  const data = JSON.parse(request.response); // теперь тут обычный объект

  inputUsd.value = (+inputRub.value / data.current.usd).toFixed(2);
  } else {
  inputUsd.value = 'Что-то пошло не так...';
  }
  });
});  
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
Сайт управляется системой uCoz