Как настроить поток верификации запроса
Данный пример иллюстрирует настройку потока, который принимает входящий SOAP-запрос по адресу https://0.0.0.0:9999/routes-cxf/api/v3, извлекает из тела сообщения идентификационные данные пользователя и текстовую метку, выполняет поиск профиля в базе данных и при наличии маркера «Data on request» в text_data корректирует рейтинг и фиксирует подозрительную операцию. Результат возвращается в виде SOAP-ответа.
Предварительные требования
Перед настройкой потока убедитесь, что выполнены следующие условия:
- WSDL-файл
data_verification_short.wsdlдоступен для загрузки в блок SOAP. - Переменные окружения для автоматического формирования адреса SOAP-сервиса заданы и доступны платформе ESB:
ESB_CORE_CXF_TRIGGER_PORT- порт, на котором работает CXF-триггер (например, 9999).ROUTES_API_PREFIX_CXF- префикс пути для CXF-маршрутов (например, /routes-cxf).
- Подключение к БД создано в менеджере соединений.
- Таблицы с данными созданы в БД:
profileс полями:user_id(VARCHAR) - идентификатор пользователяrating(NUMERIC) - текущий рейтинг пользователя
suspicious_operationс полями:user_id(VARCHAR)operation_id(VARCHAR) - идентификатор операцииrating(NUMERIC) - значение рейтинга на момент операцииreason(VARCHAR) - причина фиксацииtext_data(TEXT) - текстовая метка из запроса
Логика работы потока верификации
Алгоритм обработки запроса в потоке реализуется в следующей последовательности:
- SOAP‑блок принимает запрос по адресу
.../api/v3, выполняет удаление SOAP‑конверт и передаёт XML‑payload на следующий этап обработки. - Set Headers извлекает из XML‑payload значения
user_id,operation_idиtext_dataпосредством XPath‑выражений и размещает их в заголовках сообщения для последующего использования. - SQL‑запрос выполняет поиск записи пользователя в таблице
profileпоuser_id. - Choice осуществляет проверку наличия подстроки «Data on request» в поле
text_data:- при положительном результате - поток маршрутизируется по ветке When для пересчёта рейтинга, обновления таблицы
profile, фиксации события в таблицеsuspicious_operationи формирования ответа: «User data has been updated»; - при отрицательном результате - поток направляется по ветке Otherwise с возвратом ответа «User data has NOT been updated» без внесения изменений в БД.
- при положительном результате - поток маршрутизируется по ветке When для пересчёта рейтинга, обновления таблицы
Настройка блока SOAP
Блок SOAP в роли получателя принимает входящий SOAP-запрос и передаёт его дальше по потоку.
-
Добавьте блок SOAP из палитры блоков, переместив его на рабочую область в начало потока.
-
Нажмите Загрузить схему или темплейт и выберите файл
data_verification_short.wsdl. -
Заполните параметры блока:
| Параметр | Описание | Значение | Примечание |
|---|---|---|---|
| Address | URL, по которому доступен SOAP-сервис | https://0.0.0.0:9999/routes-cxf/api/v3 | Формируется автоматически из ESB_CORE_CXF_TRIGGER_PORT + ROUTES_API_PREFIX_CXF + пользовательский path. Необходимо дописать только /api/v3. |
| Data Format | Тело SOAP-сообщения передаётся в поток как XML-payload без конверта | PAYLOAD | |
| Schema Validation Enabled | Валидация по XML-схеме | false | Валидация структуры не требуется для данного потока - проверка содержимого выполняется блоком Choice |
| Logging Size Limit | Ограничение размера логируемого сообщения (48 КБ) | 49152 | Размер, при превышении которого тело сообщения не попадает в лог. Значение по умолчанию - 49152 байт |

Пример заполненных параметров блока SOAP (Поле Address заполняется автоматически, необходимо дописать только /api/v3)
Примечание:
Параметр Schema Validation Enabled установлен вfalse, так как валидация cтруктуры не требуется для данного потока - проверка содержимого выполняется блоком Choice.
Настройка блока извлечения заголовков
После того как SOAP-блок передал XML-payload в поток, из тела сообщения нужно извлечь идентификационные данные пользователя и текстовую метку. Для этого используется блок Set Headers, который помещает значения в заголовки сообщения для дальнейшего использования в SQL-запросах и условиях.
-
Добавьте блок Set Headers после блока SOAP.
-
Нажмите на блок и в панели свойств блока добавьте три заголовка, нажав Добавить элемент.
-
Для каждого заголовка (Header) укажите имя и выражение XPath, извлекающее значение из соответствующего элемента XML.
| Элемент | Name | Expression | Result Type |
|---|---|---|---|
| Header 1 | user_id | //*[local-name()='verification']/*[local-name()='user_id']/text() | java.lang.String |
| Header 2 | operation_id | //*[local-name()='verification']/*[local-name()='operation_id']/text() | java.lang.String |
| Header 3 | text_data | //*[local-name()='verification']/*[local-name()='text_data']/text() | java.lang.String |

Пример заполненных параметров блока Set Headers
Примечание:
Использованиеlocal-name()в XPath позволяет обращаться к элементам без привязки к префиксу пространства имён. Это подходит для случаев, когда входящие сообщения могут использовать разные префиксы SOAP-конверта.
Настройка SQL-запроса: поиск профиля пользователя
Блок SQL выполняет запрос к таблице profile и возвращает запись пользователя по идентификатору, извлечённому на предыдущем шаге.
-
Добавьте блок SQL после блока Set Headers.
-
Нажмите на блок, откроется панель настроек блока.
-
В менеджере соединений выберите предсозданное подключение к серверу или создайте новое с помощью визарда менеджер соединений.
-
Заполните параметры:
| Параметр | Значение | Описание |
|---|---|---|
| Query | select * from profile where user_id = :#user_id | Поиск профиля по user_id из заголовка. Значение берется из заголовка сообщения с именем user_id, который был установлен блоком Set Headers на предыдущем шаге. |
| Allow Named Parameters | true | Разрешить именованные параметры вида :#name |
| Output Type | SelectList | Результат возвращается в виде списка строк |
| Use Placeholder | true | Включить подстановку плейсхолдеров |

Пример заполненных параметров блока SQL
Настройка блока Choice: условная маршрутизация
Блок Choice проверяет содержимое текстовой метки и направляет выполнение по одной из двух веток.
-
Добавьте блок Choice после SQL-блока.
-
Настройте условие When:
| Параметр | Значение | Описание |
|---|---|---|
| Expression (Simple) | ${header.text_data} contains 'Data on request' | Проверка, содержит ли text_data фразу-маркер |
Подробнее о выражении ${header.text_data} contains 'Data on request':
${header.text_data}- обращение к заголовку сообщения с именемtext_data. Заголовок был установлен блоком Set Headers и содержит текстовую метку, извлечённую из тела SOAP-запроса.contains- оператор языка Simple, проверяющий вхождение подстроки. Возвращает true, если значение заголовка содержит указанную строку, и false в противном случае.'Data on request'- строка-маркер, наличие которой вtext_dataзапускает ветку обработки.
Уловия выполнения:
- При выполнении условия (true) - поток переходит в ветку When: выполняется пересчёт рейтинга, обновление таблицы profile, запись в
suspicious_operationи формирование ответа «User data has been updated». - При невыполнении условия (false) - поток переходит в ветку Otherwise: формируется ответ «User data has NOT been updated» без обращения к БД.
Ветка When
При совпадении условия выполняется последовательность из четырёх шагов.
- Добавьте блок Set Header. Он вычисляет новый рейтинг на основе значения из базы данных, уменьшая его на 0.1.
| Параметр | Значение |
|---|---|
| Name | NewRating |
| Language | Groovy |
| Expression | body[0]['rating'].subtract(0.1 as BigDecimal) |
Подробнее о выражении body[0]['rating'].subtract(0.1 as BigDecimal):
body[0]- обращение к первому элементу тела сообщения. После SQL-запроса с Output Type = SelectList тело сообщения представляет собой список строк результата. Индекс 0 выбирает первую (и единственную) строку.['rating']- обращение к колонке rating в выбранной строке. Возвращает текущее значение рейтинга пользователя из БД..subtract(0.1 as BigDecimal)- вызов метода subtract для уменьшения значения на 0.1. Приведение0.1 as BigDecimalобеспечивает точность арифметической операции с дробными значениями без потери точности, что критично для типа numeric в PostgreSQL.
Результат вычисления сохраняется в заголовке NewRating и используется в следующих SQL-запросах.
- Добавьте блок SQL в ветку When блока Choice после блока Set Header. Он обновляет рейтинг пользователя в таблице
profile.
Задайте параметр Query:
update profile
set rating = :#NewRating
where user_id = :#user_id
В поле Connection выберите подключение к серверу с помощью визарда менеджер соединений.
- Добавьте второй блок SQL в ветку When после первого блока SQL, он добавляет запись о подозрительной операции в таблицу
suspicious_operation.
Задайте параметр Query:
insert into suspicious_operation
(user_id, operation_id, rating, reason, text_data)
values (
:#user_id,
:#operation_id,
:#NewRating,
'suspicious_activity',
:#text_data
)
В поле Connection выберите подключение к серверу с помощью визарда менеджер соединений.
- Добавьте блок Set Body в ветку When блока Choice, он формирует XML-ответ с подтверждением обновления:
- Укажите Language:
Simple - Задайте параметр Expression:
<verificationResponse xmlns="http://www.bercut.com/wsdl/ns/getter/verification">
<result>User data has been updated.</result>
</verificationResponse>
Ветка Otherwise
Если условие не выполнено, поток переходит в ветку Otherwise, где сразу формируется ответ без обращения к базе данных.
Добавьте блок Set Body:
- Укажите Language:
Simple - Задайте параметр Expression:
<verificationResponse xmlns="http://www.bercut.com/wsdl/ns/getter/verification">
<result>User data has NOT been updated</result>
</verificationResponse>
Построенный поток будет выглядеть так, как показано на рисунке ниже.

Схема интеграционного потока верификации запроса
Сохранение и активация потока
-
Нажмите Сохранить справа над рабочей областью, чтобы завершить создание потока.
-
Подтвердите сохранение версии.
-
Нажмите Активировать справа над рабочей областью редактора.
Вместо кнопки Активировать на экране появится кнопка Деактивировать. Слева от нее на кнопке будет отображен текущий статус версии потока Активируемая версия. Процесс активации занимает короткое время, после чего на плашке появится надпись Активная версия.
Поток успешно развернут.
Протестируйте поток
-
Нажмите на кнопку Активная версия: 1
-
В открывшемся окне нажмите на значок копирования, чтобы скопировать адрес вызова потока.
-
Вызовите поток в Postman, отправив SOAP-запрос:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ver="http://www.bercut.com/wsdl/ns/getter/verification">
<soapenv:Header/>
<soapenv:Body>
<ver:verification>
<user_id>U123456789</user_id>
<operation_id>OP987654321</operation_id>
<service_id>SRV001</service_id>
<operation_number>TRX20250317001</operation_number>
<text_data>Sending data for processing. Data on request. Catch the results reports.</text_data>
<operation_datetime>2025-03-17T10:15:30Z</operation_datetime>
</ver:verification>
</soapenv:Body>
</soapenv:Envelope>
- Проверьте результат работы потока в зависимости от содержимого
text_data.
- Если
text_dataсодержит «Data on request» - поток выполняет обновление рейтинга и фиксацию операции. В ответе должно быть:
<verificationResponse xmlns="http://www.bercut.com/wsdl/ns/getter/verification">
<result>User data has been updated.</result>
</verificationResponse>
- Если
text_dataне содержит «Data on request» - поток возвращает ответ без изменений в БД. В ответе должно быть:
<verificationResponse xmlns="http://www.bercut.com/wsdl/ns/getter/verification">
<result>User data has NOT been updated</result>
</verificationResponse>
- В случае обнаружения подозрительного контента проверьте в БД в таблице
suspicious_operationналичие новой записи об изменении рейтинга пользователя, а также изменённое значение рейтинга в таблицеprofile.
Пример успешной работы интеграционного потока:
<verificationResponse xmlns="http://www.bercut.com/wsdl/ns/getter/verification">
<result>User data has been updated.</result>
</verificationResponse>
- Проверьте изменения в БД. Подключитесь к тестовой БД и выполните следующие запросы.
Проверка обновления рейтинга в таблице profile:
select user_id, rating
from profile
where user_id = 'U123456789';
Значение rating должно быть уменьшено на 0.1 по сравнению с исходным.
Проверка записи в таблице suspicious_operation:
select user_id, operation_id, rating, reason, text_data
from suspicious_operation
where user_id = 'U123456789'
order by 1 desc
limit 1;
Должна появиться новая запись с reason = 'suspicious_activity' и значением rating, равным новому рейтингу пользователя.
Типичные ошибки и их решение
| Ошибка | Возможная причина | Решение |
|---|---|---|
| SOAP-блок возвращает 404 | Неверный address или порт | Проверьте значения ESB_CORE_CXF_TRIGGER_PORT и ROUTES_API_PREFIX_CXF, а также путь /api/v3 в параметре Address. |
| XPath не находит элемент | Префикс пространства имён не совпадает | Используйте local-name() в XPath-выражениях, как показано в таблице блока Set Headers. |
| SQL-запрос возвращает пустой список | user_id не передан в заголовок | Проверьте блок Set Headers: имя заголовка должно совпадать с именем параметра :#user_id в SQL-запросе. |
| Choice всегда уходит в Otherwise | text_data не содержит «Data on request» | Проверьте регистр и наличие пробелов в значении text_data внутри SOAP-запроса. |
Ошибка Non-unique result | SQL вернул больше одной строки, а Output Type = SelectOne | Используйте SelectList или уточните условие WHERE в SQL-запросе. |
| Ошибка выполнения Groovy-выражения | Колонка rating отсутствует или содержит NULL | Убедитесь, что запись пользователя в таблице profile содержит непустое значение rating типа numeric. |
| Ошибка подключения к БД | Не настроено подключение в Менеджере соединений | Создайте или проверьте подключение через менеджер соединений. |