WSO2 ESB JSON в SOAP

Большинство текущих документов относятся к SOAP-to-JSON, я надеялся, есть ли какие-либо справочные материалы или учебные пособия по использованию WSO2 ESB для преобразования объекта ответа JSON в службу SOAP. Заранее спасибо.

Пример службы: http://api.statsfc.com/premier-league/table.json?key=free


person Mohamed    schedule 02.01.2013    source источник


Ответы (4)


Вы можете добиться этого с помощью конфигурации, подобной следующей; (Мы должны установить для свойства «messageType» значение «text/xml», чтобы задействовать построитель сообщений SOAP при ответе клиенту.)

<proxy xmlns="http://ws.apache.org/ns/synapse" name="JSONToSOAPService" transports="https,http">
   <target>
      <outSequence>
         <log level="full"/>
         <property name="messageType" value="text/xml" scope="axis2"/>
         <send/>
      </outSequence>
      <endpoint>
         <address uri="http://api.statsfc.com/premier-league/table.json?key=free"/>
      </endpoint>
   </target>
   <description></description>
</proxy>

Но если ваш объект ответа JSON точно такой же, как и тот, который вы получаете от предоставленного вами образца службы (т. е. если это массив анонимных объектов), ESB сократит ответ, чтобы включить только первый элемент (см. следующий ответ SOAP).

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Body>
        <position>1</position>
        <team_id>10260</team_id>
        <team>Manchester United</team>
        <played>21</played>
        <won>17</won>
        <drawn>1</drawn>
        <lost>3</lost>
        <for>54</for>
        <against>28</against>
        <difference>26</difference>
        <points>52</points>
        <info>championsleague</info>
    </soapenv:Body>
</soapenv:Envelope>                    
person udeshike    schedule 03.01.2013
comment
Спасибо, udeshike, вышеизложенное было очень полезно. К сожалению, ответ JSON очень похож на приведенный выше, и ESB включает только первый элемент в ответ SOAP. Возможно ли решить эту проблему? - person Mohamed; 06.01.2013
comment
Мохамед, я предложил новый подход для выполнения вашего требования. - person udeshike; 09.01.2013

Я мог бы преобразовать всю полезную нагрузку JSON, выполнив следующие шаги в ESB 4.5.0. Эти шаги включают изменение построителя сообщений и средства форматирования сообщений для типа содержимого application/json.

Изменить построитель сообщений, форматтер для JSON; В файле CARBON_HOME/repository/conf/axis2/axis2.xml отключите конструктор сообщений по умолчанию и средство форматирования сообщений, закомментировав следующие строки:

<messageBuilder contentType="application/json" class="org.apache.axis2.json.JSONBuilder"/>
<messageFormatter contentType="application/json" class="org.apache.axis2.json.JSONMessageFormatter"/>

Задействуйте JSONStreamBuilder и JSONStreamFormatter, раскомментировав следующие строки:

<messageFormatter contentType="application/json" class="org.apache.axis2.json.JSONStreamFormatter"/>
<messageBuilder contentType="application/json" class="org.apache.axis2.json.JSONStreamBuilder"/>

Напишите функцию Javascript для преобразования и создания новой полезной нагрузки XML.

function transformRequest(mc) {
    var array = mc.getPayloadJSON();
    var payload = <games/>;

    for (i = 0; i < array.length; ++i) {
        var elem = array[i];
        payload.game += <game>
            <position>{elem.position}</position>
            <team_id>{elem.team_id}</team_id>
            <team>{elem.team}</team>
            <played>{elem.played}</played>
            <won>{elem.won}</won>
            <drawn>{elem.drawn}</drawn>
            <lost>{elem.lost}</lost>
            <for>{elem["for"]}</for>
            <against>{elem.against}</against>
            <difference>{elem.difference}</difference>
            <points>{elem.points}</points>
            <info>{elem.info}</info>
        </game>
    }
    mc.setPayloadXML(payload);
}

Измените outSequence, чтобы выполнить преобразование входящих полезных данных JSON.

<outSequence>
    <script language="js" key="conf:/repository/esb/scripts/transformrequest.js" function="transformRequest"/>
    <property name="messageType" value="text/xml" scope="axis2"/>
    <send/>
</outSequence>
person udeshike    schedule 09.01.2013

AFAIU, вы хотите вызвать службу мыла с содержимым json и получить ответ json. Если это ваше требование, этот образец поможет вам.

person Amila Maharachchi    schedule 03.01.2013
comment
Спасибо Амила за ответ, но, к сожалению, это не мое требование. Ссылка на образец службы, которой я поделился, — это служба отдыха, которая отправляет ответ JSON после ее вызова. Я хотел бы знать, можно ли преобразовать этот ответ JSON в ответ SOAP. - person Mohamed; 03.01.2013

Если вы хотите разрешить клиентам SOAP доступ к службе REST через WSO2ESB, это возможно. Взгляните на этот пример: http://docs.wso2.org/wiki/display/ESB451/Sample+152%3A+Switching+Transports+and+Message+Format+from+SOAP+to+REST+POX

Что вы можете сделать, так это создать прокси-службу SOAP, которая находится перед вашей службой REST. Затем эта прокси-служба будет принимать запросы SOAP, преобразовывать запрос в запрос REST и перенаправлять в службу REST. Затем он может преобразовать ответ REST в формате JSON в ответ SOAP и вернуть его клиенту SOAP.

person RaviU    schedule 03.01.2013