Перейти к основному содержимому
Руководство администратора
How To статьи
Установка и настройка
Компоненты
Руководство пользователя
Начало работы

Как настроить поток верификации запроса

Данный пример иллюстрирует настройку потока, который принимает входящий 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) - текстовая метка из запроса

Логика работы потока верификации

Алгоритм обработки запроса в потоке реализуется в следующей последовательности:

  1. SOAP‑блок принимает запрос по адресу .../api/v3, выполняет удаление SOAP‑конверт и передаёт XML‑payload на следующий этап обработки.
  2. Set Headers извлекает из XML‑payload значения user_id, operation_id и text_data посредством XPath‑выражений и размещает их в заголовках сообщения для последующего использования.
  3. SQL‑запрос выполняет поиск записи пользователя в таблице profile по user_id.
  4. Choice осуществляет проверку наличия подстроки «Data on request» в поле text_data:
    • при положительном результате - поток маршрутизируется по ветке When для пересчёта рейтинга, обновления таблицы profile, фиксации события в таблице suspicious_operation и формирования ответа: «User data has been updated»;
    • при отрицательном результате - поток направляется по ветке Otherwise с возвратом ответа «User data has NOT been updated» без внесения изменений в БД.

Настройка блока SOAP

Блок SOAP в роли получателя принимает входящий SOAP-запрос и передаёт его дальше по потоку.

  1. Добавьте блок SOAP из палитры блоков, переместив его на рабочую область в начало потока.

  2. Нажмите Загрузить схему или темплейт и выберите файл data_verification_short.wsdl.

  3. Заполните параметры блока:

ПараметрОписаниеЗначениеПримечание
AddressURL, по которому доступен 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 байт

Preview

Пример заполненных параметров блока SOAP (Поле Address заполняется автоматически, необходимо дописать только /api/v3)

Примечание:
Параметр Schema Validation Enabled установлен в false, так как валидация cтруктуры не требуется для данного потока - проверка содержимого выполняется блоком Choice.

Настройка блока извлечения заголовков

После того как SOAP-блок передал XML-payload в поток, из тела сообщения нужно извлечь идентификационные данные пользователя и текстовую метку. Для этого используется блок Set Headers, который помещает значения в заголовки сообщения для дальнейшего использования в SQL-запросах и условиях.

  1. Добавьте блок Set Headers после блока SOAP.

  2. Нажмите на блок и в панели свойств блока добавьте три заголовка, нажав Добавить элемент.

  3. Для каждого заголовка (Header) укажите имя и выражение XPath, извлекающее значение из соответствующего элемента XML.

ЭлементNameExpressionResult Type
Header 1user_id//*[local-name()='verification']/*[local-name()='user_id']/text()java.lang.String
Header 2operation_id//*[local-name()='verification']/*[local-name()='operation_id']/text()java.lang.String
Header 3text_data//*[local-name()='verification']/*[local-name()='text_data']/text()java.lang.String

Preview

Пример заполненных параметров блока Set Headers

Примечание:
Использование local-name() в XPath позволяет обращаться к элементам без привязки к префиксу пространства имён. Это подходит для случаев, когда входящие сообщения могут использовать разные префиксы SOAP-конверта.

Настройка SQL-запроса: поиск профиля пользователя

Блок SQL выполняет запрос к таблице profile и возвращает запись пользователя по идентификатору, извлечённому на предыдущем шаге.

  1. Добавьте блок SQL после блока Set Headers.

  2. Нажмите на блок, откроется панель настроек блока.

  3. В менеджере соединений выберите предсозданное подключение к серверу или создайте новое с помощью визарда менеджер соединений.

  4. Заполните параметры:

ПараметрЗначениеОписание
Queryselect * from profile where user_id = :#user_idПоиск профиля по user_id из заголовка. Значение берется из заголовка сообщения с именем user_id, который был установлен блоком Set Headers на предыдущем шаге.
Allow Named ParameterstrueРазрешить именованные параметры вида :#name
Output TypeSelectListРезультат возвращается в виде списка строк
Use PlaceholdertrueВключить подстановку плейсхолдеров

Preview

Пример заполненных параметров блока SQL

Настройка блока Choice: условная маршрутизация

Блок Choice проверяет содержимое текстовой метки и направляет выполнение по одной из двух веток.

  1. Добавьте блок Choice после SQL-блока.

  2. Настройте условие 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

При совпадении условия выполняется последовательность из четырёх шагов.

  1. Добавьте блок Set Header. Он вычисляет новый рейтинг на основе значения из базы данных, уменьшая его на 0.1.
ПараметрЗначение
NameNewRating
LanguageGroovy
Expressionbody[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-запросах.

  1. Добавьте блок SQL в ветку When блока Choice после блока Set Header. Он обновляет рейтинг пользователя в таблице profile.

Задайте параметр Query:

update profile
set rating = :#NewRating
where user_id = :#user_id

В поле Connection выберите подключение к серверу с помощью визарда менеджер соединений.

  1. Добавьте второй блок 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 выберите подключение к серверу с помощью визарда менеджер соединений.

  1. Добавьте блок 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>

Построенный поток будет выглядеть так, как показано на рисунке ниже.

Preview

Схема интеграционного потока верификации запроса

Сохранение и активация потока

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

  2. Подтвердите сохранение версии.

  3. Нажмите Активировать справа над рабочей областью редактора.

    Вместо кнопки Активировать на экране появится кнопка Деактивировать. Слева от нее на кнопке будет отображен текущий статус версии потока Активируемая версия. Процесс активации занимает короткое время, после чего на плашке появится надпись Активная версия.

Поток успешно развернут.

Протестируйте поток

  1. Нажмите на кнопку Активная версия: 1

  2. В открывшемся окне нажмите на значок копирования, чтобы скопировать адрес вызова потока.

  3. Вызовите поток в 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>
  1. Проверьте результат работы потока в зависимости от содержимого 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>
  1. В случае обнаружения подозрительного контента проверьте в БД в таблице suspicious_operation наличие новой записи об изменении рейтинга пользователя, а также изменённое значение рейтинга в таблице profile.

Пример успешной работы интеграционного потока:

<verificationResponse xmlns="http://www.bercut.com/wsdl/ns/getter/verification">
<result>User data has been updated.</result>
</verificationResponse>
  1. Проверьте изменения в БД. Подключитесь к тестовой БД и выполните следующие запросы.

Проверка обновления рейтинга в таблице 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 всегда уходит в Otherwisetext_data не содержит «Data on request»Проверьте регистр и наличие пробелов в значении text_data внутри SOAP-запроса.
Ошибка Non-unique resultSQL вернул больше одной строки, а Output Type = SelectOneИспользуйте SelectList или уточните условие WHERE в SQL-запросе.
Ошибка выполнения Groovy-выраженияКолонка rating отсутствует или содержит NULLУбедитесь, что запись пользователя в таблице profile содержит непустое значение rating типа numeric.
Ошибка подключения к БДНе настроено подключение в Менеджере соединенийСоздайте или проверьте подключение через менеджер соединений.