CoderCastrov logo
CoderCastrov
Руби

Лучшие HTTP-клиенты для Ruby

Лучшие HTTP-клиенты для Ruby
просмотров
8 мин чтение
#Руби

При создании парсера веб-страниц на Ruby одним из самых важных инструментов является HTTP-клиент. HTTP-клиент - это программная библиотека или фреймворк, который позволяет отправлять и получать HTTP-запросы (GET, POST, PUT и т. д.) и ответы для общения с веб-серверами. В Ruby-экосистеме существует множество HTTP-клиентов, и выбор лучшего из них для вашего проекта может быть сложной задачей.

В этой статье мы рассмотрим некоторые из лучших HTTP-клиентов для Ruby и сравним их функциональность, производительность и удобство использования. Независимо от того, создаете ли вы простой парсер веб-страниц или сложный RESTful API, правильный выбор HTTP-клиента может сделать всю разницу в успехе вашего проекта. Итак, без лишних слов, приступим!

Факторы, по которым будет определяться ранжирование

Позвольте мне определить набор факторов, которые я собираюсь учитывать для ранжирования Ruby HTTP-клиентов в порядке убывания.

  • Производительность - библиотека должна быть быстрой и легковесной. Она должна быть способна обрабатывать большое количество параллельных запросов без задержки ответа.
  • Документация - ясная и подробная документация - еще один фактор для оценки любой библиотеки. Она должна быть хорошо написана, чтобы разработчики могли быстро начать свою работу.
  • Сообщество - сообщество должно быть достаточно большим, чтобы решить все проблемы, с которыми можно столкнуться при написании кода.
  • Звезды на Github - в конце мы также посмотрим на количество звезд, которые получила библиотека. Это число поможет нам понять ее качество и воспринимаемую полезность.

Для тестирования скорости мы собираемся выполнять GET и POST запросы с помощью библиотек, а затем тестировать время выполнения.

Для GET запроса мы собираемся использовать этот API, а для POST запроса мы собираемся использовать этот API.

Вам нужно создать отдельную папку, в которой мы будем хранить наш ruby-файл. Я называю файл check.rb. Вы можете выбрать любое имя, которое вам нравится. Чтобы запустить файл, вам просто нужно открыть папку в терминале и ввести ruby check.rb, а затем нажать Enter.

Настройка завершена, давайте начнем тестирование библиотек.

HTTParty

Это ruby-гем, который создан на основе библиотеки Net::HTTP. Он очень прост в использовании и имеет такие функции, как параметры запроса, заголовки запроса и базовая аутентификация. Давайте посмотрим, как мы можем выполнить GET- и POST-запросы с помощью [httparty](https://github.com/jnunemaker/httparty/tree/master/docs) и измерить время, затраченное библиотекой на выполнение задачи.

Для измерения затраченного времени мы будем использовать библиотеку [Benchmark](https://ruby-doc.org/stdlib-2.5.0/libdoc/benchmark/rdoc/Benchmark.html).

GET-запрос

require 'httparty'
require 'benchmark'

time = Benchmark.realtime do
  response = HTTParty.get('https://httpbin.org/get')
  puts response.body
end

puts "Запрос занял #{time} секунд"

В этом примере мы использовали метод realtime(), предоставляемый библиотекой Benchmark, для измерения времени, затраченного на выполнение запроса. Он вернет количество секунд, затраченных на выполнение запроса.

После запуска этого кода я получаю Запрос занял 0.398039 секунд в терминале. Это означает, что библиотеке потребовалось 0.398 секунды для выполнения задачи. Теперь давайте выполним POST-запрос.

POST запрос

require 'httparty'
require 'benchmark'

time = Benchmark.realtime do
  response = HTTParty.post('https://httpbin.org/post', body: { foo: 'bar' })
  puts response.body
end

puts "Запрос занял #{time} секунд"

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

Документация библиотеки очень хорошо написана и объясняет каждый шаг с примером. Кроме того, вы можете найти отличные учебники на других веб-сайтах по использованию httparty. Это указывает на то, что у библиотеки есть отличная поддержка сообщества.

HTTParty может автоматически разбирать тела ответов в различных форматах, включая JSON, XML и YAML, и возвращать их в виде объектов Ruby или хэшей. Кроме того, она может обрабатывать сообщения об ошибках, возвращая соответствующие сообщения.

В целом, любой разработчик может комфортно начать свой путь с этой гемом.

Faraday

Это еще один HTTP-клиент, который предоставляет простые API для установления HTTP-соединений с любым веб-сервером. Он имеет возможность обрабатывать таймаут соединения, ошибки, и даже может повторить запрос для вас, если первое соединение не удалось успешно установить. Функция повтора очень полезна при парсинге веб-страниц. Вы можете продолжать попытки до тех пор, пока статус запроса не станет 200.

Он также предоставляет адаптеры для Typhoeus, Excon и Net::HTTP, что позволяет разработчикам выбирать адаптер в соответствии с их собственными требованиями.

Теперь давайте проведем тестирование производительности этой библиотеки, выполнив GET- и POST-запросы.

require 'faraday'
require 'benchmark'

time = Benchmark.realtime do
  connection = Faraday.new('https://httpbin.org')
  response = connection.get('/get')
  puts response.body
end

puts "Запрос занял #{time} секунд"

После запуска этого кода я получаю Запрос занял 0.054039 секунды в терминале. Это означает, что библиотеке понадобилось 0.054 секунды для выполнения задачи. Теперь сделаем POST-запрос.

require 'faraday'
require 'benchmark'

time = Benchmark.realtime do
  connection = Faraday.new('https://httpbin.org')
  response = connection.post('/post', {foo: 'bar'})
  puts response.body
end

puts "Запрос занял #{time} секунд"

POST-запрос с использованием Faraday занял около 0.081 секунды. Великолепная скорость!

Помимо скорости, документация по Faraday очень хорошо написана. Она объясняет каждый метод, который он предлагает, с примером. Faraday также использует архитектуру промежуточного программного обеспечения, которая позволяет вам модифицировать запросы и ответы гибким и составным образом. Вы можете добавлять или удалять промежуточное программное обеспечение для настройки поведения ваших запросов.

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

Когда вы ищете faraday в Google, вы найдете много учебников. Это означает, что поддержка сообщества для этой библиотеки также отличная.

В целом, Faraday - мощная и гибкая библиотека, которая может упростить процесс выполнения HTTP-запросов и обработки ответов в ваших приложениях на Ruby.

RestClient

Это еще одна популярная библиотека HTTP-клиента. С помощью этой библиотеки вы также можете выполнять запросы GET, POST, DELETE и т. д. к любому API-конечной точке по протоколам HTTP или HTTPS.

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

Давайте посмотрим, как эта библиотека работает с запросами GET и POST.

require 'rest-client'
require 'benchmark'

time = Benchmark.realtime do
  response = RestClient.get 'https://httpbin.org/get'
  puts "Код ответа: #{response.code}"
end

puts "Запрос занял #{time} секунд"

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

require 'rest-client'
require 'benchmark'

time = Benchmark.realtime do
  response = RestClient.post 'https://httpbin.org/post', { :param1 => 'value1', :param2 => 'value2' }
  puts "Код ответа: #{response.code}"
end

puts "Запрос занял #{time} секунд"

На выполнение POST-запроса ушло около 0.1898 секунды.

Как и Faraday, RestClient также позволяет разработчикам устанавливать пользовательские заголовки и параметры для HTTP-запросов, что делает его гибким и настраиваемым для различных случаев использования.

Я не нашел больших учебников по RestClient, и документация не очень хорошо написана.

Typhoeus

Typhoeus - это Ruby-гем, который может выполнять параллельные HTTP-запросы с легкостью. Поскольку он построен на основе библиотеки libcurl, вы можете выполнять асинхронные вызовы. Это означает, что вы можете делать несколько вызовов API и затем обрабатывать ответ по мере их получения.

Давайте проверим его производительность с помощью GET-запроса.

require 'typhoeus'
require 'benchmark'

time = Benchmark.realtime do
  response = Typhoeus.get('https://httpbin.org/get')
  puts "Код ответа: #{response.code}"
  puts "Тело ответа: #{response.body}"
end

puts "Запрос занял #{time} секунд"

Таким образом, запрос занял около 0.1282 секунды. Давайте проверим, как он работает с POST-запросом.

require 'typhoeus'
require 'benchmark'

response_time = Benchmark.realtime do
  response = Typhoeus.post('https://httpbin.org/post', body: {foo: 'bar'})
  puts "Код ответа: #{response.code}"
  puts "Тело ответа: #{response.body}"
end

puts "Время ответа: #{(response_time * 1000).round(2)} мс"

POST-запрос занял около 0.1153 секунды.

Вы найдете документацию этой библиотеки довольно полезной. Она объясняет все, начиная от установки до расширенных методов с примерами. Вы даже можете установить максимальную конкурентность запроса с его помощью. Кстати, встроенное ограничение конкурентности составляет 200.

Если вы ищете высокопроизводительный HTTP-клиент, то Typhoeus может быть одним из вариантов. В целом, это отличная библиотека.

Excon

Это чистая Ruby-библиотека для клиента HTTP, построенная на основе стандартной библиотеки Ruby Net::HTTP. Она может обеспечивать шифрование SSL/TLS и потоковые ответы, а также позволяет выполнять асинхронные параллельные запросы. Многие известные Ruby-фреймворки, такие как Fog и Chef, также используют эту библиотеку.

Давайте проверим производительность этой библиотеки с помощью простого GET-запроса.

require 'excon'
require 'benchmark'

url = 'https://httpbin.org/get'

time = Benchmark.realtime do
  Excon.get(url)
end

puts "Затраченное время: #{time.round(2)} секунды"

Таким образом, для выполнения GET-запроса потребовалось около 0.23 секунды. Давайте выполним тест с помощью POST-запроса.

require 'excon'
require 'benchmark'

url = 'https://httpbin.org/post'
payload = {key1: 'value1', key2: 'value2'}

time = Benchmark.realtime do
  Excon.post(url, body: payload.to_json, headers: {'Content-Type' => 'application/json'})
end

puts "Затраченное время: #{time.round(2)} секунды"

POST-запрос занял около 0.28 секунды.

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

С другой стороны, Excon не поставляется с встроенными промежуточными слоями для общих задач, таких как разбор JSON или ведение журнала. Хотя это позволяет обеспечить большую гибкость, это может потребовать больше времени для настройки. Excon имеет некоторые продвинутые функции, что делает кривую обучения немного более крутой.

Результаты!!

Давайте сравним все статистики и посмотрим, кто является явным победителем.

Как видно, Faraday является явным победителем по скорости. Но он находится в близкой конкуренции с HTTParty по количеству звезд, отмеченных на их репозитории GitHub. Но в целом Faraday является победителем благодаря своей скорости и отличной поддержке сообщества.

По скорости HTTParty очень медленный по сравнению с другими библиотеками. Но так как у него есть отличная поддержка сообщества, вы можете рассмотреть эту библиотеку для небольших проектов. Вы найдете отличные учебники по этой библиотеке в интернете.

Заключение

В этой статье мы рассмотрели пять популярных библиотек с точки зрения их скорости выполнения и поддержки сообщества. И Faraday вышел победителем. Но это не означает, что другие библиотеки не способны создавать приложения и парсеры. Однако рекомендуется использовать Faraday при создании любого парсера, так как эта библиотека может ускорить парсинг. Faraday на 87% быстрее, чем HTTParty, что просто потрясающе. В эту библиотеку регулярно вносятся обновления, чтобы сделать ее еще более мощной.

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

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

Дополнительные ресурсы

Вот несколько дополнительных ресурсов, которые могут быть полезными во время вашего путешествия по парсингу веб-страниц: