【问题标题】:ResponseJson in wso2esb 4.9.0 is getting in tags formatwso2esb 4.9.0 中的 ResponseJson 采用标签格式
【发布时间】:2016-01-07 15:31:55
【问题描述】:

我正在使用 wso2esb 4.9.0 和 Wso2dss3.0.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>

我期待 {} 形式的结果

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

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>vikash@myunisoft.com</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>vikash@myunisoft.com</primarymail></Datalist></DataCollection></soapenv:Body></soapenv:Envelope>

【问题讨论】:

  • 首先将 log mediator 放入接收序列,并检查 log 响应实际由 out 序列处理。其次,打开浏览器开发者控制台并检查请求的 Content-Type 标头的值是什么
  • 另一种情况是您提供的示例中的“messagetype”与文档中的“messageType”不同。 Java 语言区分大小写
  • 我已经把 log mediatro 和你说的做了一些改变,但是我得到了相同的标签格式的响应我认为这是原因 asis2.xml 中的 messagebuilder 它没有将soap消息转换为 JSONresponse有效负载调解器,你有什么想法..
  • 我检查了 PayloadMediator 的源代码,它似乎根据提供的媒体类型设置了 messageType 属性。您是否尝试在发送回复消息之前将 调解器移动到?

标签: wso2 axis2 wso2esb wso2carbon wso2dss


【解决方案1】:

请检查以下代码。我正在向我的代理发送 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>

简单测试序列:

    <?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"/>

回复已收到

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

希望它会有所帮助。谢谢!!

【讨论】:

  • 我在 wso2esb 4.9.0 版本中工作,我试过这个它也以标签格式返回我。
  • 它在 wso2esb 4.8.1 上运行良好。刚刚下载了 wso2esb 4.9.0 并面临同样的问题。我认为我们在这里有解决方法。只需将媒体类型作为“json”并将 json 正文放入有效负载工厂。我正在传递一个 XML 作为参数,而 ESB 正在将该 XML 转换为 JSON 并以所需格式给出响应。我也更新了我的答案。
  • 是的,实际上我已经将这种媒体类型尝试为“JSON”,并且响应是我所期望的,但实际上我正在尝试使用媒体类型 xml 来做到这一点,它在所有以前的版本中都可以使用,但是不在 4.9.0 中,不知道为什么。
【解决方案2】:

From WSO2 documentation:

"如果要更改传出消息的负载类型,例如将其更改为 JSON,请在 &lt;/payloadFactory&gt; 之后添加 messageType 属性"

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

希望它会有所帮助。

【讨论】:

    【解决方案3】:

    您正在使用&lt;payloadFactory media-type="xml"&gt;,因此它将仅返回 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/> 
    

    希望对你有帮助!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多