Сервис для извлечения заголовков (title) веб-страниц по списку URL. Принимает HTTP запрос со списком URL и возвращает для каждого URL найденный заголовок страницы.
- Язык реализации: Scala 3
- HTTP сервер: http4s
- ФП стек: Cats Effect
- Конфигурация: PureConfig
- Кэширование: Redis
- Тестирование: ScalaTest
- Принимает POST запрос с JSON списком URL
- Извлекает заголовки страниц (содержимое тега
<title>
) - Возвращает JSON с результатами для каждого URL
- Поддерживает кэширование результатов
- Ограничивает максимальное количество URL в одном запросе
- Фильтрует разрешенные домены
- Настраивается максимальное количество URL в одном запросе
- Настраивается таймаут запроса
- Поддерживаются только HTTP/HTTPS URL
Запрос:
{
"urls": [
"https://example.com",
"https://scala-lang.org"
]
}
Успешный ответ (200 OK):
[
{
"url": "https://example.com",
"title": "Example Domain"
},
{
"url": "https://scala-lang.org",
"title": "The Scala Programming Language"
}
]
- Java 11+
- Docker (опционально)
- sbt
Собрать и запустить приложение:
sbt run
sbt test
- HTTP API (http4s) - обработка запросов
- ExtractorService - основная бизнес-логика
- UrlProcessor - извлечение заголовков страниц
- RedisCache - кэширование результатов
- Config - конфигурация приложения
- HTTP запрос → JSON парсинг → валидация URL
- Проверка кэша Redis → запрос страницы (если нет в кэше)
- Парсинг HTML → извлечение title
- Сохранение в кэш → формирование ответа
-
Кэширование:
- Используется Redis для хранения результатов
- TTL кэша: 1 час (настраивается)
-
Обработка ошибок:
- Невалидные URL пропускаются с сообщением об ошибке
- Ошибки загрузки страниц не прерывают обработку других URL
-
Безопасность:
- Ограничение на количество URL в запросе
- Настраивается "белый" список разрешенных доменов
- Таймауты и редиректы на HTTP запросы
-
Производительность:
- Параллельная обработка URL
- Кэширование для повторяющихся запросов
запрос
curl -X POST \
http://localhost:8080/api/extractor/titles \
-H 'Content-Type: application/json' \
-d '{
"urls": [
"https://example.com",
"https://google.com",
"https://scala-lang.org",
"https://rockthejvm.com"
]
}'
Ответ:
[
{
"url": "https://example.com",
"title": "Example Domain"
},
{
"url": "https://google.com",
"title": "Google"
},
{
"url": "https://scala-lang.org",
"title": "The Scala Programming Language"
},
{
"url": "https://rockthejvm.com",
"title": "No title"
}
]
Подключение к Redis через командную строку:
user@itretyakov:~$ redis-cli
Проверить все ключи:
127.0.0.1:6379> KEYS *
Получить значение по конкретному ключу:
127.0.0.1:6379> GET "https://example.com"
Проверить TTL ключа:
127.0.0.1:6379> TTL "https://example.com"