我有以下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>
我不知道这是否是最好的解决方案,但它对我有用,并帮助我从响应中提取了所需的值并将其汇总。
答案 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