WSO2 API PayloadFactory中介器XML数组到JSON数组
我正在尝试使用WSO2-am在客户端和服务器之间构建代理。最终目标是将服务器发送的响应内容更改为客户机能够理解的格式。因此,我使用PayloadFactory编写了一个自定义中介。当服务器只发送1个元素时,这种方法可以正常工作,但也可能是服务器发送多个元素。我试图使用迭代器来迭代所有元素,并对每个元素应用payloadfactory,但这只返回第一个元素,或者(当服务器的响应包含根元素时)最后一个元素 服务器输出如下所示:WSO2 API PayloadFactory中介器XML数组到JSON数组,wso2,wso2-am,mediator,Wso2,Wso2 Am,Mediator,我正在尝试使用WSO2-am在客户端和服务器之间构建代理。最终目标是将服务器发送的响应内容更改为客户机能够理解的格式。因此,我使用PayloadFactory编写了一个自定义中介。当服务器只发送1个元素时,这种方法可以正常工作,但也可能是服务器发送多个元素。我试图使用迭代器来迭代所有元素,并对每个元素应用payloadfactory,但这只返回第一个元素,或者(当服务器的响应包含根元素时)最后一个元素 服务器输出如下所示: <Monitoring> <Line>
<Monitoring>
<Line>
<Id>1</Id>
</Line>
<LocationPoint>
<Direction>
<Id>11</Id>
</Direction>
<DistanceFromPoint>1111</DistanceFromPoint>
<Point>
<Id>11111</Id>
</Point>
</LocationPoint>
</Monitoring>
<!-- Repeated 0 ... x times -->
<sequence xmlns="http://ws.apache.org/ns/synapse" name="NAME">
<iterate
preservePayload="true"
expression="//Monitoring"
id="MONITORING_ITERATOR">
<target>
<sequence>
<payloadFactory media-type="json">
<format>
{
"LineId":"$1",
"DirectionId":"$2",
"DistanceFromPoint":"$3",
"PointId":"$4"
}
</format>
<args>
<arg expression="//Line/Id"/>
<arg evaluator="xml" expression="//Direction/Id"/>
<arg evaluator="xml" expression="//DistanceFromPoint"/>
<arg evaluator="xml" expression="//Point/Id"/>
</args>
</payloadFactory>
<send />
</sequence>
</target>
</iterate>
<property name="messageType" expression="get-property('default', 'WSO2_AM_API_ACCEPT_MESSAGE_TYPE')" scope="axis2"/>
</sequence>
1.
11
1111
11111
我使用的mediotor如下所示:
<Monitoring>
<Line>
<Id>1</Id>
</Line>
<LocationPoint>
<Direction>
<Id>11</Id>
</Direction>
<DistanceFromPoint>1111</DistanceFromPoint>
<Point>
<Id>11111</Id>
</Point>
</LocationPoint>
</Monitoring>
<!-- Repeated 0 ... x times -->
<sequence xmlns="http://ws.apache.org/ns/synapse" name="NAME">
<iterate
preservePayload="true"
expression="//Monitoring"
id="MONITORING_ITERATOR">
<target>
<sequence>
<payloadFactory media-type="json">
<format>
{
"LineId":"$1",
"DirectionId":"$2",
"DistanceFromPoint":"$3",
"PointId":"$4"
}
</format>
<args>
<arg expression="//Line/Id"/>
<arg evaluator="xml" expression="//Direction/Id"/>
<arg evaluator="xml" expression="//DistanceFromPoint"/>
<arg evaluator="xml" expression="//Point/Id"/>
</args>
</payloadFactory>
<send />
</sequence>
</target>
</iterate>
<property name="messageType" expression="get-property('default', 'WSO2_AM_API_ACCEPT_MESSAGE_TYPE')" scope="axis2"/>
</sequence>
{
“LineId”:“$1”,
“DirectionId”:“$2”,
“DistanceFromPoint”:“$3”,
“PointId”:“$4”
}
所以,我的预期输出将是在format标记之间声明的json对象数组。但是,只输出1个元素。我错过了什么
编辑:我还希望基于ACCEPT头动态获取json或xml响应。通常情况下,这可以通过将收割台保存在输入流中,然后使用
<property name="messageType" expression="get-property('default', 'WSO2_AM_API_ACCEPT_MESSAGE_TYPE')" scope="axis2"/>
但是这在这里似乎也不起作用。因为您直接将xml元素映射到json元素(不改变结构),所以您可以简单地更改序列中消息的内容类型,api管理器(api管理器中的esb)将自动将xml转换为json消息,以供您选择。您不必使用迭代或有效负载工厂中介
<sequence xmlns="http://ws.apache.org/ns/synapse" name="xml_to_json_out_message">
<property name="messageType" value="application/json" scope="axis2"/>
</sequence>
这将把xml转换为json在深入搜索答案后,我没有找到任何与我的问题相关的示例。我现在使用Java编写的类中介。它不仅更灵活,而且更易于调试。我正在更改消息的结构。XML有我想要的平面Json格式的层。