Уже более десяти лет разработчики веб-приложений используют ajax для того, чтобы внести динамику в html страницы. AJAX базируется на двух принципах: динамическом обращении к серверу в фоновом режиме и DHTML. Первый принцип говорит о том, что при необходимости интерактивного взаимодействия с пользователем, в котором необходимо участие сервера, в ответ на событие от пользователя, будет сформирован и отправлен запрос на сервер в фоне. Это позволит клиенту продолжить работу с приложением, вместо того, чтобы ждать пока придёт сервер получит запрос, обработает его и вернет ответ. Когда клиент получит ответ от сервера, будет вызвана функция-обработчик, которая с помощью javascript произведёт необходимые манипуляции с DOM и изменит содержимое страницы согласно информации полученной с сервера. Так как серверу нет нужды отдавать всю страницу целиком, а то, как ответ будет обработан, ложится на того, кто будет писать клиентский код приложения, стало принято отдавать xml (X в аббревиатуре AJAX). На текущей момент мода на XML ушла и вместо него зачастую передают в теле запроса JSON. Но по факту никаких ограничений по формату на передачу нет. Всё что всможете обработать с помощью JS можно засунуть в тело ответа.
Не могу не затронуть в своем предисловие и то, зачем вообще сдался этот AJAX и какой профит от него. Первый, очевидный плюс - снижение нагрузки на сеть и сервер. Засчёт чего это происходит? Всё просто, если есть необходимость после какого-то действия пользователя изменить, небольшой участок страницы, например после авторизации необходимо в шапке сайта заменить кнопку входа, на аватрку и имя пользователя, а также кнопку перехода в ЛК, то совершенно нет необходимости возвращать на сервер всё содержимое страницы, достаточно вернуть лишь имя пользователя и url его аватара. Второй плюс - появляется возможность разгрузить сервер и нагрузить мощности клиента простой обработкой, оставив за сервером лишь ресурсоемкие задачи и задачи уровня бизнес-логики. Клиент и сам может справиться с манипулированием DOM'а. Другой плюс, для многих менее очевидный, в том, что, когда обрабткой ответа сервера управляет не браузер, а клиентская часть приложения, появялется возможность обработки ошибок, связанных с потерей соединения. Доводилось ли вам видеть такую страницу?

Да, много кто её видел. Но, что если я хочу, не имея возможности получить новую страницу из-за отсутствия интернета, посмотреть то, что у меня было загружено до этого? Можно нажать браузерную кнопку назад, но к сожалению это далеко не всегда работает. Почему это происходит? При переходе по ссылке мы передали управление браузеру. Запрос упал, и что ему делать в таком случае?

А вот, если запрос послан через AJAX, то тут уж как душе разработчика угодно. Нет интернета? Ну ладно, можешь, например, продолжать слушать ту музыку, что уже загружена в кеше. Или же почитать ту статью, на которой только что был. Здесь всё зависит от того, кто и как конкретно сделает.
Какие минусы есть у AJAX? К ним перечисляют отсутсвие сохранений в браузерной истории ajax переходов, не индексируемость поисковиками, отсутсвие учеты статистики различными google/yandex аналитками. Всё это уже давно пройдено и не правда. Есть способы решения этих проблем. Например, ничто не мешает писать в history браузера через history API. Но, конечно же, всё это требует больших манипуляций и усложняет написание кода. Такова цена за получаемый в руки разработчики контроль над запросами.
Надеюсь те, кто не знал или плохо понимал AJAX разобрались. Но что там с SuperAgent? О нём же должна быть статья. SuperAgent позиционируется разработчиками как легковесная и расширяемая библиотека для работы с AJAX.
Сразу несколько слов о том, что есть кроме неё. Есть XHR (XMLHttpRequest) - можно считать первым что появилось для работы с AJAX. Старый как наскальные рисунки. Имеет ряд недостатков, как функциональных, так и из ряда эстетики и удобства написания кода. Так, например, задача сделать цепочку зависящих друг от друга вызовов превращается в нечитаемый спагетти-код. Про передачу Multipart form-data лучше вообще не вспоминать.
Следующей на очереди является функция ajax из библиотеки jquery. Скажу лишь пару слов. Работать с ней приятнее, но во-первых это лишь кусочек достаточно жирной библиотеки.
Также на замену XHR был придуман fetch. У этой функции уже достаточно хорошая поддержка браузерами (если оно вам подходит, то никакой лишней библиотеки не нужно) вот. Ниже пример POST запроса, используя fetch.
fetch(url, {
method: 'post',
headers: {
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8"
},
body: 'a=b&c=d'
})
.then(json)
.then(function (data) {
console.log('Request succeeded with JSON response', data);
})
.catch(function (error) {
console.log('Request failed', error);
});
В fetch появилась нормальная возможность передачи formdata, есть поддержка promise, API представлен ввиде функции, в отличии от xhr, который был достаточно сложным и страшным объектом. Можно сразу пачкой передать нужные заголовки в виде объекта. Всё хорошо.
Однако, почему статья не о нём, а о SuperAgent? Мне лично не понравилось то, что вся конфигурация запроса задаётся одним объектом. Когда же появятся условная обработка, то выше образуется множество кода, который собирает объект по кусочкам, для запроса. а потом уже в него впихнут всё что нужно и то, что внесёт вызов fetch скроется. Конвейерный подход SuperAgent мне нравится больше. Вот пример запроса на SuperAgent
request
.post('/api/pet')
.send({ name: 'Manny', species: 'cat' })
.set('X-API-Key', 'foobar')
.set('Accept', 'application/json')
.then(res =>{
console.log('I got: ' + JSON.stringify(res.body));
}).catch(error => {
console.log("Something wrong", errror);
});
SuperAgent умеет много полезных вещей: из коробки просто работать с CORS запросами, посылать form-data, есть возможность задать кол-во попыток отправки запроса, сделать редирект, можно переопределить функцию, которая решает какие запросы завершились с ошибкой. Также есть поддержка промисов и генераторов, плюс приятной плюшкой идёт возможность отслеживания прогресса загрузки больших файлов. Не самое важное, но стоит заметить, что у библиотеки очень хорошая поддержка. Работает она аж на 7ой версии IE.
На текущий момент, для меня SuperAgent является лучшей библиотекой для работы с ajax. Оставлю вам ссылочку на гитхаб, документацию и npm-пакет в репозиториии.
На этом я, пожалуй, откланяюсь.