#wso2 #wso2esb
#wso2 #wso2-esb
Вопрос:
У меня есть следующий json, который я повторяю, чтобы получить каждый токен и идентификатор: {
"Response": {
"Data": [{
"Token": "12345",
"Code": "10148117"
}, {
"Token": "123465",
"Code": "10148118"
}]
}
}
<iterate expression="//Data" id="it1">
<target>
<sequence>
<property expression="//Data/Token" name="SaveFireToken"
scope="default" type="STRING" />
<property expression="//Data/Code" name="SaveCustCode"
scope="default" type="STRING" />
<filter regex="(.|s)*S(.|s)*" source="get-property('SaveFireToken')">
<then />
<else>
<payloadFactory media-type="json">
<format>{
"OutputTimeStamp": "$1",
"OutputRequestID": "$2",
"StatusCode" :"3",
"StatusMessage" : "No token found"
}
</format>
<args>...
</args>
</payloadFactory>
<respond />
</else></filter>
<script language="js">...</script>
<payloadFactory description="Request"
requst to backend
</payloadFactory>
<call>
<endpoint>
<address uri="https://..."/>
</endpoint>
</call>
</sequence>
</target>
</iterate>
Допустим, у меня есть 2 основных вызова серверной части, затем я получаю 2 ответа, которые выглядят как:
{"id":0000,"success":1,"failure":0,"can_ids":0,"results":[{"message_id":"00000"}]}
Я пытался объединить их, но безуспешно:
<aggregate id="it1">
<completeCondition>
<messageCount min="-1" max="-1" />
</completeCondition>
<onComplete expression="$body/*[1]">
<log>...<log>
</onComplete>
</aggregate>
Может кто-нибудь показать мне, где я делаю что-то не так? Я подозреваю, что использую это неправильно- xpression=»$body/*[1]», или, если есть способ объединить свойство result в json из ответов. Также агрегат должен быть внутри или снаружи iterate mediator, я видел это обоими способами?
Редактировать:
Через некоторое время я закончил использовать это:
<aggregate id="it1">
<completeCondition>
<messageCount max="-1" min="-1"/>
</completeCondition>
<onComplete expression="//jsonObject/success" xmlns:ns="http://org.apache.synapse/xsd">
<log level="full">...</log>
</onComplete>
</aggregate>
Я не знаю, лучшее ли это решение, но оно сработало для меня и помогло мне извлечь нужные мне значения из ответа и объединить их.
Комментарии:
1. Отвечает ли конечная точка сервера в SOAP / xml?
2. Нет, он отвечает с помощью with json.
Ответ №1:
Моя первая мысль, когда я вижу этот вопрос, заключается в том, правильно ли выражение, которое вы дали для iterate mediator. Предполагая, что вы включили точную полезную нагрузку json, которую вы повторяете, выражение должно быть следующим :
<iterate expression="//Response/data" id="it1">
.....
</iterate>
Что касается вашего второго вопроса, ваше выражение для aggregate mediator правильное. И у вас должен быть aggregate mediator вне iterate mediator. Единственная проблема, которую я вижу, заключается в том, что у вас нет заключающего элемента для объединения отдельных ответов. Другими словами, нам нужен внешний массив. Для достижения, пожалуйста, сделайте что-то вроде приведенного ниже. (Добавьте атрибут enclosingElementProperty к тегу onComplete)
<property name="Aggregated_Responses" scope="default">
<jsonObject />
</property>
<aggregate id="it1">
<completeCondition>
<messageCount min="-1" max="-1" />
</completeCondition>
<onComplete expression="$body/*[1]" enclosingElementProperty="Aggregated_Responses">
<log>...<log>
</onComplete>
</aggregate>
Iterate mediator обрабатывает полезную нагрузку json в виде xml на уровне реализации. Следовательно, нам нужны такие обходные пути для достижения этой функциональности. Для получения дополнительных ссылок, пожалуйста, обратитесь к этому блогу. https://medium.com/@nirothipanram/wso2-esb-iterate-and-aggregate-json-requests-ab5fc3617f