6

当前的大多数文档都参考了 SOAP-to-JSON,我希望在使用 WSO2 ESB 将 JSON 响应对象转换为 SOAP 服务时是否有任何参考资料或教程。提前致谢。

示例服务: http ://api.statsfc.com/premier-league/table.json?key=free

4

4 回答 4

6

您可以使用类似于以下的配置来实现此目的;(我们必须将“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>                    
于 2013-01-03T16:44:46.697 回答
4

我可以通过 ESB 4.5.0 中的以下步骤来转换完整的 JSON 有效负载。这些步骤涉及更改 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>
于 2013-01-09T17:53:57.293 回答
2

AFAIU 你想调用一个带有 json 内容的soap服务并得到一个 json 响应。如果这是您的要求,示例将为您提供帮助。

于 2013-01-03T04:56:55.137 回答
1

如果您想允许 SOAP 客户端通过 WSO2ESB 访问 REST 服务,这是可能的。看看这个示例:http ://docs.wso2.org/wiki/display/ESB451/Sample+152%3A+Switching+Transports+and+Message+Format+from+SOAP+to+REST+POX

您可以做的是创建一个位于 REST 服务前面的 SOAP 代理服务。然后,此代理服务将接收 SOAP 请求,将请求转换为 REST 请求并转发到 REST 服务。然后它可以将 JSON 格式的 REST 响应转换为 SOAP 响应并返回给 SOAP 客户端。

于 2013-01-03T11:40:24.257 回答