【问题标题】:WSO2 API PayloadFactory mediator XML array to JSON arrayWSO2 API PayloadFactory 中介 XML 数组到 JSON 数组
【发布时间】:2016-02-19 10:04:51
【问题描述】:

我正在尝试使用 WSO2-AM 在客户端和服务器之间构建代理。最终目标是将服务器发送的响应内容更改为客户端可以理解的格式。因此,我使用 PayloadFactory 编写了一个自定义中介。当服务器仅发送 1 个元素时,这可以正常工作,但服务器可能会发送多个元素。我正在尝试使用迭代器来迭代所有元素并将有效负载工厂应用于每个元素,但这仅返回第一个元素,或者(当服务器的响应包含在根元素中时)最后一个元素。

服务器输出如下所示:

<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>

所以我的预期输出将是在格式标签之间声明的 json 对象数组。但是仅输出 1 个元素。我错过了什么?

编辑:我还想根据 ACCEPT 标头动态获取 json 或 xml 响应。通常可以通过在 IN 流中保存标头然后使用

<property name="messageType" expression="get-property('default', 'WSO2_AM_API_ACCEPT_MESSAGE_TYPE')" scope="axis2"/>

但这似乎也不起作用。

【问题讨论】:

    标签: wso2 wso2-am mediator


    【解决方案1】:

    由于您是直接将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

    【讨论】:

    • 我正在更改消息的结构。 XML 具有我想要平面 Json 格式的层。
    【解决方案2】:

    在密集搜索答案后,我没有找到任何与我的问题相关的示例。我现在使用一个用 Java 编写的类中介。 Tis 不仅更灵活,而且更易于调试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多