Статьи

Сравнение JavaScript HTTP-библиотек для браузера

Ajax-запросы активно используются на современных веб-сайтах. В дополнение к использованию встроенного способа выполнения Ajax-запросов, с использованием экземпляра XMLHttpRequest , многие разработчики используют методы jQuery для выполнения той же задачи.

В этой статье мы рассмотрим две альтернативные библиотеки, которые позволяют вам достичь одной и той же цели. В частности, я собираюсь охватить superagent и axios . Чтобы сравнить их, мы собираемся выполнить несколько запросов к фиктивному HTTP-сервису.

Введение в библиотеки

Экземпляр XMLHttpRequest может выполнять синхронные или асинхронные запросы. JavaScript является однопоточным, поэтому синхронные запросы блокируют выполнение других операций. По этой причине мы никогда не используем их на практике. Библиотеки, описанные в этой статье, axios и superagent, всегда выполняют асинхронные запросы. Поскольку ваш код продолжает работать, пока браузер выполняет запрос в фоновом режиме, вы не можете сразу же получить ответ. Вы должны предоставить функцию для вызова, когда ответ сервера готов, обычно называемый обратным вызовом , который будет обрабатывать ответ.

Чтобы обработать этот процесс, axios возвращает Обещание . И наоборот, API суперагента не соответствует никаким стандартам. Таким образом, в отношении этой функции мы можем сказать, что axios лучше, чем superagent. Преимущество заключается в том, что вы можете комбинировать обещание, возвращаемое axios, с обещанием других библиотек или с обещаниями, которые вы создаете с помощью встроенного объекта JavaScript. Если вам нужен обзор обещаний, вы можете прочитать этот учебник .

С другой стороны, superagent более известен и имеет небольшую экосистему плагинов (например, префикс superagent для добавления префикса ко всем URL-адресам).

Axios и superagent наиболее подходят, когда вы хотите использовать базовые функции POST / PUT / GET для взаимодействия с API. Например, они не поддерживают мониторинг хода загрузки, как это делает XMLHttpRequest в современных браузерах. Их главное преимущество заключается в том, что вы можете настраивать и отправлять запрос, просто соединяя несколько вызовов функций.

Как установить библиотеки

XMLHttpRequest требует установки. Все современные браузеры, начиная с Internet Explorer 8 и выше, поддерживают XHMLHttpRequest . Суперагент распространяется как модуль npm и как компонентный модуль . Чтобы установить суперагент с помощью npm, сначала его нужно установить. npm поставляется со стандартным установщиком Node.js или io.js , так что вам стоит либо поработать , если у вас уже установлен Node.js / io.js, либо установить тот, который вы предпочитаете. Затем вам нужно использовать клиентское упаковочное решение, такое как browserify, чтобы включить в ваши файлы superagent . Если у вас нет опыта работы с ним, SitePoint опубликовал учебник, в котором обсуждаются функции browserify .

axios распространяется как модуль npm, модуль AMD и как простой файл JavaScript, который экспортирует глобальный объект axios . Вы можете скачать их все из хранилища axios Githib .

Пример API

Наш пример API — это сервис управления заказами для пекарни. Клиенты могут искать заказы по дате, выполнив запрос GET, как показано ниже:

 /orders?start=2015-03-23&end=2015-03-24 

Клиент также может создать новый заказ, выполнив запрос POST:

 /orders 

Данные, возвращаемые сервером в случае запроса GET, и данные, отправляемые веб-сайтом для создания нового заказа, предоставляются в формате JSON. Например, если текущая дата — 4 мая, а клиенту необходимо доставить 3 шоколадных торта и 5 лимонных кексов 10 марта, можно отправить объект JSON, например:

 { "chocolate": "3", "lemon": "5", "delivery": "2015-03-10", "placed": "2015-03-04" } 

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

Создание нового заказа

Для создания заказа нам необходимо указать:

  1. метод запроса (POST)
  2. URL запроса ( /orders )
  3. тело запроса (детали нашего заказа в формате JSON)
  4. тип содержимого тела запроса ( application/json )

Рекомендуется указывать тип содержимого тела: сервер может затем определить из заголовков запроса, как анализировать тело.

Мы настраиваем дополнительный запрос с выделенным методом для каждого параметра конфигурации, затем вызываем end() для отправки запроса. Функция end() принимает обратный вызов в качестве аргумента для обработки ответа. Если первый аргумент обратного вызова верен, произошла ошибка. Давайте посмотрим на пример:

 var request = require('superagent'); request.post('/orders/') .send({'chocolate': 2, 'placed': '2015-04-26'}) .type('application/json') .accept('json') .end(function(err, res) { if (err) { console.log('Error!'); } else { console.log(res.body); } }); 

axios принимает URL-адрес в качестве первого аргумента, тело запроса в качестве второго аргумента и всю оставшуюся конфигурацию в качестве третьего параметра. Чтобы обработать ответ, вы можете указать два обратных вызова: один для случая успеха (я передам его then ) и один для случая ошибки (я передам его для catch ). Пример использования показан ниже:

 axios.post( '/orders/', { chocolate: 2, placed: '2015-04-26' }, { headers:{ 'Content-type': 'application/json', 'Accept': 'application/json' } } ) .then(function(response) { console.log(response.data); }) .catch(function(response) { console.log('Error!) }); 

Чтобы достичь той же цели с помощью XMLHttpRequest , мы настраиваем метод HTTP и URL в функции open() . Затем мы прикрепляем ответный обратный вызов к обработчику onload и вызываем send для отправки запроса. Пример использования показан ниже:

 var xhr = new XMLHttpRequest(); // The last parameter must be set to true to make an asynchronous request xhr.open('POST', '/orders/', true); xhr.setRequestHeader('Content-type', 'application/json'); xhr.setRequestHeader('Accept', 'application/json'); xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { console.log(xhr.response); } else { console.log('Error !'); } }; xhr.send(); 

Браузер присоединяет данные ответа к самому объекту XMLHttpRequest . Чтобы узнать, произошла ли ошибка, мы должны проанализировать состояние ответа и управлять им так, как мы предпочитаем. В этом случае я регистрирую ответ, возвращенный в случае статуса успеха (от 200 до 299); строка 'Error !' в противном случае.

Получение заказов на основе диапазона дат

Чтобы получить заказы, размещенные в диапазоне дат, мы установим параметры start и end запроса. Функция superagent query() принимает объект, который содержит параметры запроса и их значения:

 request.get('/orders') .query({start: '2015-04-22', end: '2015-04-29'}) .accept('json') .end(function(err, res) { if (err) { /* Handle error */ } else { /* Handle response */ } }); 

axios использует ключ params в объекте конфигурации:

 axios.get( '/orders', { headers: { 'Accept': 'application/json' }, params: { start: '2015-04-22', end: '2015-04-29' } } ); 

Строки запроса не должны содержать определенные символы, особенно & , = и ? , И axios, и superagent позаботятся о том, чтобы экранировать параметры запроса.

При использовании XMLHttpRequest вам необходимо вручную encodeURIComponent() компоненты, используя встроенную функцию encodeURIComponent() в паре ключ-значение строки запроса. Ниже вы можете найти пример того, как вы можете это сделать, даже если для этого конкретного случая это излишне:

 var xhr = new XMLHttpRequest(); xhr.open('GET', '/orders?start=' + encodeURIComponent('2015-04-22') + '&end=' + encodeURIComponent('2015-04-29'), true); 

рекомендации

Хотя axios использует обещания, код выглядит почти идентично superagent. С superagent вы устанавливаете тип контента с помощью специального метода, но с axios вы должны быть осторожны, чтобы избежать опечаток в имени заголовка.

superagent и axios автоматически десериализуют тело запроса в зависимости от типа контента. Вы можете достичь той же цели, установив свойство responseType в экземпляре XMLHttpRequest . Они также обрабатывают все не-200 ответы как ошибки, в то время как XMLHttpRequest предлагает большую гибкость, позволяя вам управлять кодом состояния и затем действовать соответственно.

И суперагент, и Axios работают также на сервере. Однако у superagent самый приятный API на мой взгляд. Но если вы хотите обещания, Axios — ваш лучший выбор. И последнее замечание: если вы можете самостоятельно обрабатывать различия между браузерами или просто ориентироваться на современные браузеры, XMLHttpRequest вполне подойдет.

Вывод

В этой статье мы увидели, как взаимодействовать с простым REST API с использованием необработанного XMLHttpRequest , axios и superagent . Три решения предлагают эквивалентную функциональность, но со своими особенностями. Если вы работаете с современными браузерами, вы можете положиться на XMLHttpRequest . superagent и axios удобны, если вы хотите избежать работы со старыми версиями Internet Explorer и использовать один и тот же API на сервере.

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