WSO2 ESB - 使用有效负载标签内的 XML 数据调用 Web 服务 [英] WSO2 ESB - Invoking Webservices with XML data within a tag of the payload

查看:12
本文介绍了WSO2 ESB - 使用有效负载标签内的 XML 数据调用 Web 服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要通过中间件调用外部 Web 服务,我的有效负载中的一个标签包含嵌入式 XML.下面的示例有效负载和序列片段.我遇到以下问题.

I have a requirement to invoke an external webservice(s) via the Middleware, with one of the tags in my payload containing embedded XML. Sample payload and sequence snippet below. I encounter the following issues.

场景 1:(第 24 行)表达式="get-property('PayloadXML')" - 发出发送命令后,无法识别 Web 服务方法.

Scenario 1 : (line 24) expression="get-property('PayloadXML')" - Upon issuing a send command, the webservice method is not recognized.

场景 2 : (line 24) expression="get-property('lPayload')" - 发出发送命令后,成功调用 web 服务方法.然而,为了让目标系统成功处理消息,它需要处理 CDATA 元素(包装).

Scenario 2 : (line 24) expression="get-property('lPayload')" - Upon issuing a send command, the webservice method is successfully invoked. However, for the target system to successfully process the message, it would need to handle the CDATA element(wrapping).

当尝试通过soapUI 调用场景2 时,该过程是成功的.根据我的研究(在 WSO2 中传递 CDATA),soapUI 似乎在内部处理 CDATA元素,在转发消息之前.

When trying to invoke Scenario 2 via soapUI, the process is successful. From what I've researched (Passing CDATA in WSO2), soapUI seems to internally handle the CDATA element, before forwarding the message.

现在,我知道我设置场景 2 的方式并不理想(更像是一种 hack),但我不知道有任何其他方法可以实现这一点.我已经阅读了许多博客/帖子,并尝试通过 XSLT 调解器转换(开发)有效负载,但没有成功.我还遇到过以下帖子 http://www.yenlo.com/en/how-to-preserve-a-cdata-in-xml-that-is-circulating-in-a-wso2-enterprise-service-bus/ ,但我似乎找不到所引用的补丁.

Now, I understand the way I'm setting scenario 2 is not ideal(more of a hack), but I'm unaware of any other ways to achieve this. I've read numerous blogs/posts and tried transforming(developing) the Payload via the XSLT mediator with no luck. I've also come across the following post http://www.yenlo.com/en/how-to-preserve-a-cdata-in-xml-that-is-circulating-in-a-wso2-enterprise-service-bus/ , but I can't seem to find the patch that is being referred to.

所以我的问题如下:1. 有没有其他方法/机制可以达到我的要求?2. WSO2 ESB 4.9.0 版本会解决上述问题吗?

So my questions are as follows: 1. Are there any other ways/mechanisms for me to achieve my requirements? 2. Will the WSO2 ESB 4.9.0 release resolve the issues mentioned above?

样本负载:

<sample><test>MyData</test></sample>

序列片段:

     <property xmlns:ns1="http://ws.wso2.org/dataservice"
               xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
               name="PayloadXML"
               expression="$body/data-services-event/content/ns1:return/ns1:return/ns1:PayLoadXML"/>
     <property xmlns:ns="http://org.apache.synapse/xsd"
               name="lPayload"
               expression="fn:concat(fn:concat('&lt;![CDATA[',get-property('PayloadXML')), ']]&gt;')"/>
     <payloadFactory media-type="xml">
        <format>
           <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                             xmlns:log="http://mynamespace">
              <soapenv:Header/>
              <soapenv:Body>
                 <log:publishMessage>
                    <Payload xmlns="">$1</Payload>
                 </log:publishMessage>
              </soapenv:Body>
           </soapenv:Envelope>
        </format>
        <args>
           <arg xmlns:ns2="http://org.apache.synapse/xsd"
                xmlns:ns="http://org.apache.synapse/xsd"
                evaluator="xml"
                expression="get-property('lPayload')"/>
        </args>
     </payloadFactory>

推荐答案

这是一个示例代理服务,它接收 XML 数据并发送回一个新的 XML 消息,其中包含 CDATA 部分中输入内容的子部分.

Here is a sample proxy service that receive XML data and send back a new XML message with a sub part of the input content in a CDATA section.

发送:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <PayloadXML>
            <sample><test>MyData</test></sample>
        </PayloadXML>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

您收到:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header/>
    <soapenv:Body>
        <log:publishMessage xmlns:log="http://mynamespace">
            <Payload><![CDATA[<sample><test>MyData</test></sample>]]></Payload>
        </log:publishMessage>
    </soapenv:Body>
</soapenv:Envelope>

代理定义:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse" name="TestSOF" transports="http" statistics="disable" trace="disable" startOnLoad="true">
    <target>
        <inSequence>
            <!-- extract xml content from the input message -->
            <property name="xmlContent" expression="$body/PayloadXML/*[1]" type="OM"/>
            <!-- compose a new message -->
            <enrich>
                <source type="inline" clone="true">
                    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
                        <soapenv:Header/>
                        <soapenv:Body>
                            <log:publishMessage xmlns:log="http://mynamespace">
                                <Payload xmlns=""/>
                            </log:publishMessage>
                        </soapenv:Body>
                    </soapenv:Envelope>
                </source>
                <target type="envelope"/>
            </enrich>
            <!-- create a CDATA section for 'Payload' node -->
            <script language="js">
                importPackage(Packages.org.apache.axiom.om);
                var payloadElmt = mc.getEnvelope().getBody().getFirstElement().getFirstElement();
                var omText = payloadElmt.getOMFactory().createOMText(payloadElmt, mc.getProperty("xmlContent"), OMNode.CDATA_SECTION_NODE);
                payloadElmt.addChild(omText)                    
            </script>
            <!-- send back this new message as a response for the caller -->
            <header name="To" action="remove"/>
            <property name="RESPONSE" value="true"/>
            <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
            <send/>
        </inSequence>
    </target>
    <description/>
</proxy>

这篇关于WSO2 ESB - 使用有效负载标签内的 XML 数据调用 Web 服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆