WSO2 EI/ESB — последовательный вызов нескольких конечных точек для создания пользовательского объекта

Чего я пытаюсь достичь:

Используя API Enterprise Integrator, я хочу объединить данные из двух конечных точек службы данных (назовем их ORDERS и METADATAS) в настраиваемый объект, например:

[
  {
     Order: {},
     Metadata: {}
  }, ...
]

На данный момент API принимает единственный параметр USER_ID. Когда я запускаю посредник <call> в режиме блокировки, я получаю следующую проблему:

Current Params: {USER_ID={1,1}, ID=test}

or

Current Params: {USER_ID={test,1}}

В неблокирующем режиме первый вызов работает успешно, а второй вызов не может быть продолжен. Кажется, он не может получить доступ к параметру USER_ID из URL-адреса или из сохраненного свойства. Я думал, что свойства должны сохранять значения?

Следует отметить, что значения в журналах являются точными на 100% (свойство USER_ID показывает правильное значение).

INFO {org.apache.synapse.mediators.builtin.LogMediator} - _TEST = 1, _TEST2 = 1, _TEST3 = 1

Вот что у меня есть для inSequence:

<resource methods="GET" uri-template="/test?USER_ID={USER_ID}">
    <inSequence>
        <property expression="get-property('query.param.USER_ID')" name="USER_ID" scope="default" type="STRING"/>
        <property expression="$url:USER_ID" name="uri.var.USER_ID" scope="default" type="STRING"/>
        <call blocking="true">
            <endpoint>
                <http method="get" statistics="enable" trace="enable" uri-template="https://localhost:8243/services/ORDERS_DataService/user/{query.param.USER_ID}"/>
            </endpoint>
        </call>
        <log level="custom">
            <property expression="get-property('USER_ID')" name="_TEST"/>
            <property expression="get-property('query.param.USER_ID')" name="_TEST2"/>
            <property expression="get-property('uri.var.USER_ID')" name="_TEST3"/>
        </log>
        <enrich>
            <source clone="false" type="body"/>
            <target property="_ORDERS" type="property"/>
        </enrich>
        <filter regex="200" source="get-property('axis2', 'HTTP_SC')">
            <then>
                <log level="custom">
                    <property name="switchlog" value="Case: first call successful"/>
                </log>
                <call blocking="true">
                    <endpoint>
                        <http method="get" statistics="enable" trace="enable" uri-template="https://localhost:8243/services/ORDERS_DataService/metadata/user/{query.param.USER_ID}"/>
                    </endpoint>
                </call>
                <enrich>
                    <source clone="false" type="body"/>
                    <target property="_METADATAS" type="property"/>
                </enrich>
                <log level="custom">
                    <property expression="get-property('_METADATAS')" name="_METADATAS"/>
                </log>
            </then>
            <else/>
        </filter>
    </inSequence>
</resource>

Что я пробовал?

Использование {USER_ID}, {uri.var.USER_ID}, {$url:USER_ID} и {query.param.USER_ID} в обоих шаблонах uri для <call>s.

Пробовал неблокирующий и блокирующий режим, получая разные результаты.

Моя проблема только (на данный момент) с вызовом обеих последовательностей и назначением свойств.

Я планировал собрать их все вместе с помощью итерации и что-то вроде приведенного ниже, чтобы сопоставить свойства с каждым из элементов в массиве, который я ищу:

<!-- Assuming iterate provides _ORDER and _METADATA whilst looping -->
<format>
{
    "Order":"$1",
    "Metadata":"$2"
}
</format>
<args>
    <arg expression="get-property('_ORDER')"/>
    <arg expression="get-property('_METADATA')"/>
</args>

И если это не сработает, я собирался оценить преобразование XSLT для двух элементов, но я еще не думал так далеко, застрял на двух вызовах, которые не работают должным образом.


person Thomas    schedule 22.07.2019    source источник


Ответы (1)


Я понял ответ на вопрос. Нашел эту любопытную строчку, похороненную в документации [1]:

<property name="REST_URL_POSTFIX" scope="axis2" action="remove"/>

Добавление его сразу после захвата параметра запроса работает! Он делает именно то, что говорит, по-видимому, по умолчанию применяется Postfix. Теперь нужно искать глобальный способ отключить это автоматически!

Ссылки:

[1] https://docs.wso2.com/display/EI650/Configuring+Specific+Use+Cases

person Thomas    schedule 23.07.2019