Неверный ответ — вызов одной службы ESB REST из другой

Я относительно новичок в WSO2 ESB, пытаясь вызвать веб-службу REST с параметром GET, который размещен на WSO2 ESB через другой REST API.

Это простая веб-служба (SampleREST), которая отвечает приветственным сообщением в формате XML, когда я вызываю эту службу напрямую; я вижу правильный ответ в браузере, показанный ниже

<Message xmlns="http://ws.apache.org/ns/synapse">WelcomeRanjan</Message>

Теперь я создал другую веб-службу REST (InvokeSampleRest), которая, в свою очередь, вызывает веб-службу SampleREST с параметризованным GET, клиент Invoke WebService возвращает мне XML-ответ, завернутый в xml-тег посредника, и другие искаженные данные. теги, показанные ниже

<mediate><<Message xmlns>"http://ws.apache.org/ns/synapse">WelcomeRanjan&lt;/Message></<Message xmlns></mediate>

Вот мой код для SampleREST API

<?xml version="1.0" encoding="UTF-8"?>
<api xmlns="http://ws.apache.org/ns/synapse" name="SampleREST" context="/SampleRest" hostname="10.203.245.47">
    <resource methods="GET" uri-template="/{str1}">
        <inSequence>
            <header name="To" action="remove"/>
            <property name="RESPONSE" value="true" scope="default" type="STRING"/>
            <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
            <payloadFactory>
                <format>
                    <Message>$1</Message>
                </format>
                <args>
                    <arg expression="get-property('uri.var.str1')"/>
                </args>
            </payloadFactory>
            <log level="full" separator=",">
                <property name="sequence" value="*** Got Request ***"/>
            </log>
            <send/>
        </inSequence>
        <outSequence/>
        <faultSequence/>
    </resource>
</api>

Код для кода InvokeSampleREST показан ниже (я вызываю службу SampleREST отсюда)

<?xml version="1.0" encoding="UTF-8"?>
<api xmlns="http://ws.apache.org/ns/synapse" name="InvokeSampleREST" context="/InvokeSampleREST" hostname="10.203.245.47">
       <resource methods="GET" uri-template="/{str1}">
        <inSequence>
            <log level="full" separator=","/>
            <property name="REST_URL_POSTFIX" expression="fn:concat('/Welcome',get-property('uri.var.str1'))" scope="axis2" type="STRING"/>
            <log level="full">
                <property name="sequence" value="****Message Sent *** "/>
            </log>
            <send>
                <endpoint>
                    <address uri="http://10.203.245.47:8280/SampleRest/"/>
                </endpoint>
            </send>
        </inSequence>
        <outSequence>
            <log level="full" separator=",">
                <property name="out" value="** Ouput of Rest call ***"/>
            </log>
            <property name="ContentType" value="application/xml" scope="axis2" type="STRING"/>
            <send/>
        </outSequence>
        <faultSequence/>
    </resource>
</api>

Цените любую помощь. Спасибо, Ранджан


person Ranjan    schedule 24.05.2013    source источник


Ответы (2)


Почему вы используете два API? Вы можете спроектировать свой поток в одном API. Я имею в виду, что вы можете объединить их вместе. Кстати, вам нужно установить свойство contentType в вашем бэкэнд-API (например: в SampleREST API). Потому что, когда вы отправляете ответ на API «InvokeSampleREST», система не знает тип содержимого входящего ответа и пытается его обработать как текстовое сообщение.

Eg:

 <api name="SampleREST" context="/SampleRest" hostname="localhost">
      <resource methods="GET" uri-template="/{str1}">
         <inSequence>
            <header name="To" action="remove"/>
            <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
            <property name="RESPONSE" value="true" scope="default" type="STRING"/>
            <payloadFactory>
               <format>
                  <Message>$1</Message>
               </format>
               <args>
                  <arg expression="get-property('uri.var.str1')"/>
               </args>
            </payloadFactory>
            <log level="full" separator=",">
               <property name="sequence" value="*** Got Request ***"/>
            </log>
            <property name="Content-Type"
                      value="application/xml"
                      scope="transport"
                      type="STRING"/>
            <send/>
         </inSequence>
         <faultSequence/>
      </resource>

person Ratha    schedule 27.05.2013

Попробуйте внести следующие изменения в InvokeSampleREST API.

В outSequence установите тип сообщения перед посредником ‹send› следующим образом.

<property name="messageType" value="application/xml" scope="axis2"/>
person Isuru Udana    schedule 26.05.2013
comment
Привет, Исуру, я попробовал упомянутое выше свойство в коде, но все равно ответ такой же. Не могли бы вы проверить, работает ли это для вас. - person Ranjan; 27.05.2013