Skip to content

Latest commit

 

History

55 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

API Poller

Курсовая работа по дисциплине "Объектно-ориентированное программирование"

CLI-утилита, которая периодически опрашивает указанные REST API по HTTP и накапливает полученные ответы в один файл - JSON или CSV.

Использованные технологии

Написана на Java 21, сборка - Maven, сети/внешние API - модуль java.net.http. Для работы с JSON используется tools.jackson (Jackson 3), а CSV-вывод написан вручную. Тесты - JUnit 5 + Mockito.

Принцип работы и использование

Конфиг лежит в src/main/resources/apis.json - в нём описаны API, которые утилита умеет опрашивать. Для каждого API задаются: id, имя, базовый URL, нужен ли ключ и дополнительные пути (поля подробно описаны ниже).

Режим работы задаётся аргументами командной строки:

Режим Аргументы Описание
Интерактивный interactive Все параметры задаются в диалоге
Автоматический automatic <csv|json> <maxConcurrent> <interval> Формат, лимит параллельных запросов и интервал задаются CLI аргументами, а остальное в диалоге

maxConcurrent и interval должны быть неотрицательными целыми. interval = 0 означает непрерывный опрос.

В обоих режимах утилита работает одинаково:

  1. Определяет, какие API опрашивать.
  2. Для каждого выбранного API, если он требует дополнительного пути, дописывает этот путь к базовому URL.
  3. Запускает PollingManager: для каждого API планируется повторяющаяся задача опроса, которая шлёт GET запрос через java.net.http.HttpClient.
    • Каждый ответ оборачивается в структуру с полями: id, source, timestamp, data и дописывается в выходной файл.
    • Выполнение параллельных запросов ограничено Semaphore согласно указанному maxConcurrent значению, записи в файл синхронизированы ReentrantLock.
    • Если интервал t = 0, опрос идёт без пауз.
  4. Форматировщик (JSON или CSV) превращает ответ в запись и сохраняет результат в файл.

Интерактивный режим

./mvnw exec:java -Dexec.args="interactive"

Все параметры опроса задаются в диалоге. Утилита последовательно задаёт вопросы:

  1. Какие API опрашивать - по id (несколько через запятую, например 1,2,13) или all.
  2. Какие API выводить - по id (через запятую), фильтруется по уже выбранным. Или all / none.
  3. Режим записи - 0 = перезаписать файл, 1 = дописывать.
  4. Формат файла - 0 = JSON, 1 = CSV.
  5. maxConcurrent - максимум одновременных запросов.
  6. interval - интервал опроса в секундах.
  7. Для каждого API, которому нужен дополнительный путь - выбрать его (или random, при котором параметр будет выбран 1 раз случайно).

После запуска опроса ввод stop (и enter) останавливает опрос, выходит в graceful завершение. Если за 20 секунд все запросы не получили ответ, менеджер прерывает их. Сохраняет результат.

Автоматический режим

./mvnw exec:java -Dexec.args="automatic json 3 10"

Формат, лимит параллельных запросов и интервал передаются в CLI. У пользователя спрашивается только то, какие API опрашивать. Файл перезаписывается. Если требуется дополнительный путь для API, то он выбирается случайно.

Остановка - Ctrl+C, механизм завершения работы приложения тот же, что и в интерактивном режиме.

Формат вывода

JSON

[
  {
    "id": 1,
    "source": "The Movie Database",
    "timestamp": "2026-01-01T12:00:00+00:00",
    "data": { ...сам ответ API... }
  }
]

id инкрементируется автоматически.

CSV

Каждая новая запись добавляется строкой. Вложенные объекты превращаются в колонки с точечной нотацией (data.location.city), массивы объектов разворачиваются в несколько строк, примитивные массивы склеиваются символом |. Заголовки из разных API сливаются, у отсутствующих колонок пусто.

Конфигурация (apis.json)

Каждый элемент массива:

  • id - числовой идентификатор (по нему выбираем API в CLI)
  • name - отображаемое имя
  • key_needed - нужен ли ключ (тогда в заголовок Authorization дописывается API_KEY)
  • API_KEY - сам ключ (в примере заглушка key)
  • base_request_url - базовый URL
  • additional_path_needed - нужен ли доп. путь к базовому URL
  • additional_paths - доступные дополнительные пути
  • headers - заголовки

Шаблон здесь.

Сборка и запуск

Требования

Команды

Сборка и прогон всех тестов:

./mvnw clean test        # macOS / Linux
mvnw.cmd clean test      # Windows

Запуск из командной строки:

./mvnw exec:java -Dexec.args="interactive"
./mvnw exec:java -Dexec.args="automatic json 3 10"

Тесты

Coverage

Тесты описаны в документации тестов.

Актуальный отчёт JaCoCo автоматически публикуется с помощью GitHub Pages при каждом прогоне CI на ветке main.

About

CLI for async HTTP GET requests to APIs

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages