我有以下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>
我不知道它是否是最好的解决方案,但它对我有用,并帮助我从响应中提取我需要的值并汇总它们。
当我看到这个问题时,我的第一个想法是你为迭代介体给出的表达式是否正确。假设您已经包含了正在迭代的确切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