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

时间:2019-03-13 13:25:21

标签: wso2 wso2esb

我有以下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>

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

1 个答案:

答案 0 :(得分: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