REST-сервис на Spring Boot для получения данных по облигациям с Московской биржи. Принимает список тикеров, запрашивает корпоративные и государственные облигации через MOEX API, парсит XML-ответ и возвращает результат в JSON.
- Единый endpoint для двух типов облигаций — корпоративные (TQCB) и государственные (TQOB) в одном запросе
- Фильтрация по тикерам — принимает список интересующих тикеров, возвращает только нужные
- Кэширование — данные с MOEX кэшируются, чтобы не превысить лимиты запросов к бирже
- Унифицированный ответ — все облигации приводятся к единой модели
Stock - Защита от XXE — парсер XML настроен с ограничениями безопасности
- Java 17
- Spring Boot
- Spring Cache
- Feign Client
- DOM XML Parser
- Maven
POST /bonds/getBondsByTickers- Контроллер принимает POST-запрос со списком тикеров
BondServiceзапрашивает оба источника через Feign-клиенты:- Корпоративные облигации:
iss.moex.com/.../boards/TQCB/securities.xml - Государственные облигации:
iss.moex.com/.../boards/TQOB/securities.xml
- Корпоративные облигации:
- Каждый ответ парсится через
MoexXmlParserImplс извлечением атрибутовSECID,PREVPRICE,SHORTNAME - Результаты объединяются и фильтруются по запрошенным тикерам
- Отфильтрованные облигации маппятся в модель
Stockчерез Builder - Возвращается
StocksDtoсо списком найденных облигаций
| Компонент | Назначение |
|---|---|
BondMoexController |
REST-контроллер, принимает запросы |
BondService |
Бизнес-логика: вызов клиентов, парсинг, фильтрация |
CorporateBondsClient |
Feign-клиент для корпоративных облигаций |
GovBondsClient |
Feign-клиент для государственных облигаций |
MoexXmlParserImpl |
Парсер XML-ответа MOEX (DOM) |
BondParsingException |
Кастомное исключение для ошибок парсинга |
LimitRequestsException |
Кастомное исключение при пустом ответе MOEX |
@Cacheable("corps")— кэширует список корпоративных облигаций@Cacheable("govs")— кэширует список государственных облигаций
Кэш хранится в памяти приложения (ConcurrentHashMap). При повторном запросе тех же тикеров данные берутся из кэша, без обращения к MOEX.
Парсер настроен с защитой от XXE-атак:
dbf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
dbf.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);В application.yml настраиваются URL-адреса MOEX:
moex:
bonds:
corporate:
url: "https://iss.moex.com/iss/engines/stock/markets/bonds/boards/TQCB/securities.xml?..."
government:
url: "https://iss.moex.com/iss/engines/stock/markets/bonds/boards/TQOB/securities.xml?..."Уровень логирования Feign-запросов:
logging:
level:
ru.dasha.MoexService.moexclient: debugmvn spring-boot:runСервис запустится на порту 8080 (настраивается в application.yml).