WSO2 API PayloadFactory 中介 XML 数组到 JSON 数组
WSO2 API PayloadFactory mediator XML array to JSON array
我正在尝试使用 WSO2-AM 在客户端和服务器之间构建代理。最终目标是将服务器发送的响应内容更改为客户端可以理解的格式。因此,我使用 PayloadFactory 编写了一个自定义调解器。当服务器只发送 1 个元素时,这工作正常,但服务器发送多个元素是可能的。我正在尝试使用迭代器来迭代所有元素并将 payloadfactory 应用于每个元素,但这只是 returns 第一个元素,或者(当服务器的响应包含在根元素中时)最后一个元素.
服务器输出看起来像这样:
<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":"",
"DirectionId":"",
"DistanceFromPoint":"",
"PointId":""
}
</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>
所以我的预期输出是在格式标签之间声明的 json objects 数组。但是只输出 1 个元素。我错过了什么?
编辑:我还想根据 ACCEPT header 动态获得 json 或 xml 响应。通常这可以通过在 IN 流中保存 header 然后使用
来实现
<property name="messageType" expression="get-property('default', 'WSO2_AM_API_ACCEPT_MESSAGE_TYPE')" scope="axis2"/>
但这在这里似乎也行不通。
由于您直接将 xml 元素映射到 json 元素(不更改结构),您可以简单地更改序列中消息的内容类型和 api manager (esb in api manager) 会自动将 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 编写的 class 调解器。 Tis不仅更灵活,也更容易调试。
我正在尝试使用 WSO2-AM 在客户端和服务器之间构建代理。最终目标是将服务器发送的响应内容更改为客户端可以理解的格式。因此,我使用 PayloadFactory 编写了一个自定义调解器。当服务器只发送 1 个元素时,这工作正常,但服务器发送多个元素是可能的。我正在尝试使用迭代器来迭代所有元素并将 payloadfactory 应用于每个元素,但这只是 returns 第一个元素,或者(当服务器的响应包含在根元素中时)最后一个元素.
服务器输出看起来像这样:
<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":"",
"DirectionId":"",
"DistanceFromPoint":"",
"PointId":""
}
</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>
所以我的预期输出是在格式标签之间声明的 json objects 数组。但是只输出 1 个元素。我错过了什么?
编辑:我还想根据 ACCEPT header 动态获得 json 或 xml 响应。通常这可以通过在 IN 流中保存 header 然后使用
来实现<property name="messageType" expression="get-property('default', 'WSO2_AM_API_ACCEPT_MESSAGE_TYPE')" scope="axis2"/>
但这在这里似乎也行不通。
由于您直接将 xml 元素映射到 json 元素(不更改结构),您可以简单地更改序列中消息的内容类型和 api manager (esb in api manager) 会自动将 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 编写的 class 调解器。 Tis不仅更灵活,也更容易调试。