简体   繁体   English

WSO2 ESB-在有效负载的标记内使用XML数据调用Web服务

[英]WSO2 ESB - Invoking Webservices with XML data within a tag of the payload

I have a requirement to invoke an external webservice(s) via the Middleware, with one of the tags in my payload containing embedded XML. 我需要通过中间件调用外部Web服务,并且负载中的标签之一包含嵌入式XML。 Sample payload and sequence snippet below. 以下是有效负载和序列片段的示例。 I encounter the following issues. 我遇到以下问题。

Scenario 1 : (line 24) expression="get-property('PayloadXML')" - Upon issuing a send command, the webservice method is not recognized. 场景1 :(第24行)expression =“ get-property('PayloadXML')”-发出发送命令后,无法识别Webservice方法。

Scenario 2 : (line 24) expression="get-property('lPayload')" - Upon issuing a send command, the webservice method is successfully invoked. 方案2 :(第24行)expression =“ get-property('lPayload')”-发出send命令后,将成功调用webservice方法。 However, for the target system to successfully process the message, it would need to handle the CDATA element(wrapping). 但是,要使目标系统成功处理该消息,就需要处理CDATA元素(包装)。

When trying to invoke Scenario 2 via soapUI, the process is successful. 尝试通过soapUI调用方案2时,该过程成功。 From what I've researched ( Passing CDATA in WSO2 ), soapUI seems to internally handle the CDATA element, before forwarding the message. 根据我的研究( 在WSO2中传递CDATA ),在转发消息之前,soapUI似乎在内部处理CDATA元素。

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. 现在,我了解设置方案2的方式并不理想(更多是hack),但是我不知道有任何其他方法可以实现此目的。 I've read numerous blogs/posts and tried transforming(developing) the Payload via the XSLT mediator with no luck. 我已经阅读了许多博客/帖子,并尝试通过XSLT中介器来转换(开发)有效载荷,但没有成功。 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. 我还遇到了以下帖子http://www.yenlo.com/en/how-to-preserve-a-cdata-in-xml-that-is-circulating-in-a-wso2-enterprise-service -bus / ,但是我似乎找不到所引用的补丁。

So my questions are as follows: 1. Are there any other ways/mechanisms for me to achieve my requirements? 所以我的问题如下:1.我是否还有其他方法/机制可以满足我的要求? 2. Will the WSO2 ESB 4.9.0 release resolve the issues mentioned above? 2. WSO2 ESB 4.9.0版本是否可以解决上述问题?

Sample Payload : 有效负载样本:

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

Sequence Snippet : 序列片段:

     <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>

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. 这是一个示例代理服务,该服务接收XML数据并发送回新的XML消息,以及CDATA节中输入内容的一部分。

Send it : 发送 :

<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>

You receive : 你收到 :

<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>

The proxy def : 代理def:

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

If your basic requirement is to pass xml data within a tag, Here is an example for that. 如果您的基本要求是在标记内传递xml数据,那么这里是一个示例。

Here I am using wso2 ESB 4.9.0. 在这里,我正在使用wso2 ESB 4.9.0。 Basic thing is, you need to store the payload factory format in registry and use it in the payload factory configuration as bellow. 基本的事情是,您需要将有效负载工厂格式存储在注册表中,并在下面的有效负载工厂配置中使用它。

<proxy xmlns="http://ws.apache.org/ns/synapse"
   name="foo"
   transports="https,http"
   statistics="disable"
   trace="disable"
   startOnLoad="true">
<target>
    <inSequence>
        <property xmlns:ns="http://org.apache.synapse/xsd"
                  name="Request"
                  expression="$body/child::*[fn:position()=1]"
                  scope="default"
                  type="STRING"/>
        <payloadFactory media-type="xml">
            <format key="conf:/repository/esb/myPF"/>
            <args>
                <arg evaluator="xml" expression="$ctx:Request"/>
                <arg value="1"/>
            </args>
        </payloadFactory>

        <send>
            <endpoint>
                <address uri="http://127.0.0.1:9763/services/Hello"/>
            </endpoint>
        </send>
    </inSequence>
    <outSequence>
        <send/>
    </outSequence>
</target>
<description/>

Above is my proxy service. 以上是我的代理服务。 I am getting the first child from the request ESB gets from the client and use it as the input for the payload factory mediator. 我从请求ESB从客户端获取到第一个孩子,并将其用作有效负载工厂中介程序的输入。

Content of the registry resource looks like bellow. 注册表资源的内容如下所示。

<ns:testMethod xmlns:ns="http://example.com">
                            <xs:xmlBody xmlns:xs="http://example.com"><![CDATA[$1]]></xs:xmlBody>
                            <xs:sessionId xmlns:xs="http://example.com">$2</xs:sessionId>
                        </ns:testMethod>

You can test the scenario by enabling wirelogs for ESB[2]. 您可以通过为ESB [2]启用线路日志来测试场景。

Here I have hosted a simple axis2 service in WSO2 AS for testing. 在这里,我在WSO2 AS中托管了一个简单的axis2服务以进行测试。 Here is the wirelog output. 这是线日志输出。

   [2016-02-24 19:02:24,696] DEBUG - wire << "POST /services/Hello HTTP/1.1[\r][\n]"
 [2016-02-24 19:02:24,696] DEBUG - wire << "Content-Type: application/soap+xml; charset=UTF-8; action="urn:mediate"[\r][\n]"
 [2016-02-24 19:02:24,696] DEBUG - wire << "Transfer-Encoding: chunked[\r][\n]"
 [2016-02-24 19:02:24,696] DEBUG - wire << "Host: 127.0.0.1:9763[\r][\n]"
 [2016-02-24 19:02:24,697] DEBUG - wire << "Connection: Keep-Alive[\r][\n]"
 [2016-02-24 19:02:24,697] DEBUG - wire << "User-Agent: Synapse-PT-HttpComponents-NIO[\r][\n]"
 [2016-02-24 19:02:24,697] DEBUG - wire << "[\r][\n]"
 [2016-02-24 19:02:24,697] DEBUG - wire << "180[\r][\n]"
 [2016-02-24 19:02:24,697] DEBUG - wire << "<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><ns:testMethod xmlns:ns="http://example.com"><xs:xmlBody xmlns:xs="http://example.com"><![CDATA[<sample><test>MyData</test></sample>]]></xs:xmlBody><xs:sessionId xmlns:xs="http://example.com">1</xs:sessionId></ns:testMethod></soapenv:Body></soapenv:Envelope>[\r][\n]"
 [2016-02-24 19:02:24,697] DEBUG - wire << "0[\r][\n]"
 [2016-02-24 19:02:24,697] DEBUG - wire << "[\r][\n]"

Here you can find the defined registry resource with content type as text/xml registry resource 在这里,您可以找到内容类型为text/xml 注册表资源的已定义注册表资源

[2] https://docs.wso2.com/display/ESB490/Setting+Up+Logging [2] https://docs.wso2.com/display/ESB490/Setting+Up+Logging

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM