2015-09-14 2 views
1

Я работаю с wso2esb 4.9.0 и Wso2dss3.0.0ResponseJson в wso2esb 4.9.0 получает в формате теги

У меня есть простой выбор услуги, как показано ниже.

<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="Simpleselect" 
     transports="https,http" 
     statistics="disable" 
     trace="disable" 
     startOnLoad="true"> 
    <target> 
     <inSequence> 
     <property name="messagetype" 
        value="application/json" 
        scope="axis2" 
        type="STRING"/> 
     <property name="usercode" 
        expression="//usercode/text()" 
        scope="default" 
        type="STRING"/> 
     <payloadFactory media-type="xml"> 
      <format> 
       <p:username_op xmlns:p="http://ws.wso2.org/dataservice"> 
        <p:usercode>$1</p:usercode> 
       </p:username_op> 
      </format> 
      <args> 
       <arg evaluator="xml" expression="get-property('usercode')"/> 
      </args> 
     </payloadFactory> 
     <send receive="simpletest"> 
      <endpoint> 
       <address uri="http://localhost:9764/services/muser_DataService/"/> 
      </endpoint> 
     </send> 
     </inSequence> 
     <outSequence> 
     <send/> 
     </outSequence> 
    </target> 
    <description/> 
</proxy> 

Последовательность:

<sequence name="simpletest" xmlns="http://ws.apache.org/ns/synapse"> 
    <property name="messageType" scope="axis2" value="application/json"/> 
    <property name="FORCE_ERROR_ON_SOAP_FAULT" value="true"/> 
    <property name="HTTP_METHOD" scope="axis2" value="POST"/> 
    <property expression="//s:Datalist" name="Datalist" scope="default" 
     type="STRING" xmlns:ns="http://org.apache.synapse/xsd" 
     xmlns:ns3="http://org.apache.synapse/xsd" xmlns:s="http://ws.wso2.org/dataservice"/> 
    <property expression="count(//s:Datalist)" name="Total" 
     scope="default" type="STRING" 
     xmlns:ns="http://org.apache.synapse/xsd" 
     xmlns:ns3="http://org.apache.synapse/xsd" xmlns:s="http://ws.wso2.org/dataservice"/> 
    <filter xmlns:ns="http://org.apache.synapse/xsd" 
     xmlns:ns3="http://org.apache.synapse/xsd" xpath="get-property('Total')='0.0'"> 
     <then> 
      <property name="RESPONSE" scope="default" type="STRING" value="true"/> 
      <payloadFactory media-type="xml"> 
       <format> 
        <ResponseJSON xmlns=""> 
         <Body> 
          <Datalist>Not Found</Datalist> 
         </Body> 
         <Status>404</Status> 
        </ResponseJSON> 
       </format> 
      </payloadFactory> 
      <send/> 
     </then> 
     <else> 
      <property name="RESPONSE" scope="default" type="STRING" value="true"/> 
      <property action="remove" name="NO_ENTITY_BODY" scope="axis2"/> 
      <payloadFactory media-type="xml"> 
       <format> 
        <ResponseJSON xmlns=""> 
         <Body>$1</Body> 
         <Status>200</Status> 
         <Total>$2</Total> 
        </ResponseJSON> 
       </format> 
       <args> 
        <arg evaluator="xml" expression="get-property('Datalist')"/> 
        <arg evaluator="xml" expression="get-property('Total')"/> 
       </args> 
      </payloadFactory> 
      <send/> 
     </else> 
    </filter> 
</sequence> 

Когда я называю это услуги с помощью CURL его дает мне ответ в виде тегов, как показано

<ResponseJSON><Body><Datalist xmlns="http://ws.wso2.org/dataservice"><userid>-1899999899</userid><username>Vikash Sinha</username><usercode>vikash</usercode></Datalist></Body><Status>200</Status><Total>1.0</Total></ResponseJSON> 

Am ожидает результат в виде {} подобные

{"ResponseJSON":{"Body":{"Datalist":parameters},"Status":"200","Total":"1.0"}} 

messag е форматировщики и строители в axix2.xml являются

<messageFormatter contentType="application/json" 
          class="org.apache.synapse.commons.json.JsonStreamFormatter"/> 
<messageBuilder contentType="application/json" 
         class="org.apache.synapse.commons.json.JsonStreamBuilder"/> 

журналов:

[2015-09-15 10:44:02,979] INFO - LogMediator To: http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: , MessageID: urn:uuid:942e2525-29f7-4ef6-b64f-709ea41f4bbf, Direction: response, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><DataCollection xmlns="http://ws.wso2.org/dataservice"><Datalist><partybranchid>2127629166052452</partybranchid><partybranchname>other locations</partybranchname><partyid>460077453499443</partyid><partyname>Youtility Technologies Pvt Ltd</partyname><ouid>-1</ouid><organizationunitname>NONE</organizationunitname><inchargeid>-1899999899</inchargeid><sbuheadid>-1</sbuheadid><usercriteriaconfigid>1187416899913503</usercriteriaconfigid><primarymail>[email protected]</primarymail></Datalist><Datalist><partybranchid>2545910581364239</partybranchid><partybranchname>DBPB001</partybranchname><partyid>2534954639984412</partyid><partyname>DBPRTY001</partyname><ouid>2538210579514587</ouid><organizationunitname>DBORG001</organizationunitname><inchargeid>2540093122446574</inchargeid><sbuheadid>1209449655666077</sbuheadid><usercriteriaconfigid>1187416899913503</usercriteriaconfigid><primarymail>[email protected]</primarymail></Datalist></DataCollection></soapenv:Body></soapenv:Envelope> 
+0

Прежде всего поместите медиатор журнала в последовательность приема и проверьте, что ответ фактически обработан последовательностью.Во-вторых, открытая консоль разработчика браузера и проверьте, что такое значение заголовка Content-Type для запроса. – simar

+0

Другой пример - «messagetype» в примере u, в документации есть другой вариант «messageType». Java lang чувствителен к регистру – simar

+0

Я поместил журнал mediatro и внес некоторые изменения, так как я сказал, но получаю тот же ответ в формате тегов. Я думаю, что причиной этого является сборщик сообщений в asis2.xml, который не преобразует мыльное сообщение в JSONresponse в посреднике полезной нагрузки, У меня есть идея .. – user4045063

ответ

0

Пожалуйста, проверьте ниже кода. Я отправляю XML-вход в свой прокси-сервер, который взаимодействует с какой-либо целевой системой и получает ответ XML и предоставляет ответ в формате JSON для клиента.

прокси Код:

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="StackOverflow_Proxy" 
     transports="https,http" 
     statistics="disable" 
     trace="disable" 
     startOnLoad="true"> 
    <target> 
     <inSequence> 
     <property name="usercode" 
        expression="//usercode/text()" 
        scope="default" 
        type="STRING"/> 
     <payloadFactory media-type="xml"> 
      <format> 
       <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
           xmlns:dat="http://ws.wso2.org/dataservice"> 
        <soapenv:Header/> 
        <soapenv:Body> 
        <dat:getChainInfo> 
         <dat:usercode>$1</dat:usercode> 
        </dat:getChainInfo> 
        </soapenv:Body> 
       </soapenv:Envelope> 
      </format> 
      <args> 
       <arg evaluator="xml" expression="get-property('usercode')"/> 
      </args> 
     </payloadFactory> 
     <header name="Action" scope="default" value="urn:getChainInfo"/> 
     <log level="full"> 
      <property name="============= REQUEST ============" expression="$body"/> 
     </log> 
     <send receive="simpleTest"> 
      <endpoint> 
       <address uri="http://localhost:8001/services/DataService_Proxy"/> 
      </endpoint> 
     </send> 
     </inSequence> 
     <outSequence/> 
    </target> 
    <description/> 
</proxy> 

SimpleTest Последовательность:

<?xml version="1.0" encoding="UTF-8"?> 
<sequence name="simpleTest" xmlns="http://ws.apache.org/ns/synapse"> 
    <property name="messageType" scope="axis2" type="STRING" value="application/json"/> 
    <property name="FORCE_ERROR_ON_SOAP_FAULT" value="true"/> 
    <log> 
     <property expression="$body" 
      name="============ RESPONSE =================" xmlns:ns="http://org.apache.synapse/xsd"/> 
    </log> 
    <property name="HTTP_METHOD" scope="axis2" value="POST"/> 
    <property name="RESPONSE" scope="default" type="STRING" value="true"/> 
    <property 
     expression="$body/*[local-name() = 'ChainDesc']" 
     name="responseDocument" scope="default" type="STRING" xmlns:ns="http://org.apache.synapse/xsd"/> 
    <payloadFactory media-type="json"> 
     <format>{ 
    "ResponseJSON": { 
    "Body": "$1", 
    "Status": "200", 
    "Total": "1.0" 
    } 
}</format> 
     <args> 
      <arg evaluator="xml" 
       expression="get-property('responseDocument')" xmlns:ns="http://org.apache.synapse/xsd"/> 
     </args> 
    </payloadFactory> 
    <send/> 
</sequence> 

axis2.xml конфигурации, как показано ниже.

<messageFormatter contentType="application/json" 
          class="org.apache.synapse.commons.json.JsonStreamFormatter"/> 

<messageFormatter contentType="application/json/badgerfish" 
          class="org.apache.axis2.json.JSONBadgerfishMessageFormatter"/> 

<messageBuilder contentType="application/json" 
         class="org.apache.synapse.commons.json.JsonStreamBuilder"/> 

<messageBuilder contentType="application/json/badgerfish" 
         class="org.apache.axis2.json.JSONBadgerfishOMBuilder"/> 

Response ПОЛУЧАЛО

{ 
    "ResponseJSON": { 
    "Body": "{"ChainDesc":{"O_text":4,"O_status":6,"O_msg":"SuccessFul"}}", 
    "Status": "200", 
    "Total": "1.0" 
    } 
} 

Надеется, что это поможет. Благодаря!!

+0

Hi Deepak это сделано в wso2esb 4.9.0 ..? – user4045063

+0

Я работаю в версии wso2esb 4.9.0, я пробовал это, он также возвращает меня в формате тегов. – user4045063

+0

Он был на wso2esb 4.8.1 и работал отлично. Просто скачал wso2esb 4.9.0 и столкнулся с той же проблемой. Я думаю, у нас есть обходной путь здесь. Просто возьмите медиа-тип как «json» и положите тело json на фабрику полезных данных. Я передаю XML как аргумент, как вы делали, и ESB конвертирует этот XML в JSON и дает ответ в нужном формате. Я также обновил свой ответ. –

0

From WSO2 documentation:

«Если вы хотите изменить тип полезной нагрузки исходящего сообщения, например, чтобы изменить его в формат JSON, добавить свойство MessageType после </payloadFactory>»

... 
</payloadFactory> 
<property name="messageType" value="application/json" scope="axis2"/> 

enter image description here

Надеюсь, это поможет.

0

Вы используете <payloadFactory media-type="xml">, чтобы он возвращал результат только в формате XML. если вы хотите это в json, то измените завод полезной нагрузки на,

<payloadFactory media-type="json"> 
    <format>{ 
    "ResponseJSON": { 
"Body": "$1", 
"Status": "200", 
"Total": "$2" 
} 
}</format> 
    <args> 
     <arg evaluator="xml" expression="get-property('Datalist')"/> 
     <arg evaluator="xml" expression="get-property('Total')"/> 
    </args> 
</payloadFactory> 
<property name="messageType" value="application/json" scope="axis2"/> 
<send/> 

Надеюсь, что это поможет !!