在WSO2中组合来自迭代中介的json响应

问题描述 投票:2回答:1

我有以下json,我迭代以获得每个标记和id:{ "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中的result属性与响应结合起来。聚合应该在迭代调解器的内部或外部,我已经看到了两种方式?

编辑:

过了一会儿我最终使用了这个:

 <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>

我不知道它是否是最好的解决方案,但它对我有用,并帮助我从响应中提取我需要的值并汇总它们。

wso2 wso2esb
1个回答
1
投票

当我看到这个问题时,我的第一个想法是你为迭代介体给出的表达式是否正确。假设您已经包含了正在迭代的确切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

© www.soinside.com 2019 - 2024. All rights reserved.