Чего я пытаюсь достичь:
Используя 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 для двух элементов, но я еще не думал так далеко, застрял на двух вызовах, которые не работают должным образом.