Я пытаюсь создать прокси между клиентом и сервером с помощью 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 элемент. Что мне не хватает?

РЕДАКТИРОВАТЬ: я также хочу динамически получать ответ json или xml на основе заголовка ACCEPT. Обычно это возможно, сохраняя заголовок в потоке IN, а затем используя

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

Но и здесь это, похоже, не работает.

1
Cerebres 19 Фев 2016 в 13:04

2 ответа

Лучший ответ

После интенсивных поисков ответа я не нашел примеров, связанных с моей проблемой. Теперь я использую посредник классов, написанный на Java. Это не только более гибко, но и легче поддается отладке.

0
Cerebres 24 Фев 2016 в 12:50

Поскольку вы напрямую сопоставляете элемент xml с элементом json (не изменяя структуру), вы можете просто изменить тип содержимого сообщения в последовательности, и диспетчер api (esb в диспетчере api) автоматически преобразует сообщение 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

1
Chamila Adhikarinayake 20 Фев 2016 в 14:42