Объединить ответы json из iterate mediator в WSO2

#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