Объединить ответы JSON от повторного посредника в WSO2 - PullRequest
2 голосов
/ 13 марта 2019

У меня есть следующий 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]", или если есть способ объединить свойство результата в json из ответов.Кроме того, агрегат должен быть внутри или за пределами итеративного посредника, я видел это в обоих направлениях?

РЕДАКТИРОВАТЬ:

Через некоторое время я использовал это:

 <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 Ответ

1 голос
/ 18 марта 2019

Моя первая мысль, когда я вижу этот вопрос, является ли правильное выражение, которое вы дали для итеративного посредника. Предполагая, что вы включили точную полезную нагрузку json, которую вы перебираете, выражение должно быть следующим:

<iterate expression="//Response/data" id="it1">
    .....
</iterate>

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

Итерационный посредник обрабатывает полезную нагрузку json как xml на уровне реализации. Следовательно, мы должны иметь такие обходные пути для достижения этой функциональности. Для получения дополнительной ссылки, пожалуйста, обратитесь к этому блогу. https://medium.com/@nirothipanram/wso2-esb-iterate-and-aggregate-json-requests-ab5fc3617f

...