WSO2 ESB - 自动添加的肥皂信封导致问题

时间:2017-02-15 16:15:48

标签: soap proxy wso2 esb envelope

我正在探索WSO2 ESB并遇到了一个问题。我正在使用一个简单的传递代理来从SAP(或Postman,测试)发布XML数据,然后转发到REST API - 应该很容易!

当我直接POST到REST API(而不是通过ESB)时,它运行正常。(200,OK)

但是WSO2 ESB会自动添加SOAP Envelope,而REST API则不接受。我已经尝试了各种方法来删除自动添加的SOAP信封,但没有成功。试过XSLT转换,POX格式,Enrich mediator等,我能找到的每一个建议。 (如果它是作为正文的一部分发送,我可以使用XSLT删除信封元素,但不是WSO2添加的那个)

我可以使用:

访问没有SOAP信封的正文
<property name="body" expression="$body/*[1]" type="OM"/>

但我不确定如何将其转发给API。

如何阻止在WSO2 ESB中首先添加此信封,或者如何删除它?

我使用了this回答中的xslt代码,当我在主体中包含SOAP标记时,它可以正常工作,但对似乎在WSO2中自动添加的SOAP信封没有影响(除了给出错误,见下文。)

我尝试了该行的不同变体:

<xsl:apply-templates select="soap:Envelope/soap:Body/*"/>

,例如

<xsl:apply-templates select="soap:Envelope/*"/>
<xsl:apply-templates select="/*"/>

这是我在ESB日志中看到的错误:

无法使用以下命令执行XSLT转换:对源XPath使用值{name ='null',keyValue ='discountPayment'}:s11:Body / child :: [position()= 1] | s12:正文/子:: [position()= 1]原因:无法使用XSLT结果创​​建OMElement

我是WSO2 ESB的新手,之前没有使用过XSLT,所以在我的方法中可能是一些非常基本的错误....

这是我的代理xml和XSLT“removeSOAP”:

<?xml version="1.0" encoding="UTF-8"?>
<proxy name="APIServer" startOnLoad="true" trace="disable"
  transports="https http" xmlns="http://ws.apache.org/ns/synapse">
  <target>
    <inSequence>
      <log level="full">
        <property name="FirstLog" value="APITest LOG...."/>
        <property name="payload" expression="$body/*[1]" type="OM"/>
      </log>
      <xslt key="removeSOAP"/>              
      <log level="full">
        <property name="SecondLog" value="after xslt...."/>
      </log>
  <property name="messageType" scope="axis2" type="STRING" value="application/xml"/>
          <send>      
          <endpoint name="endpoint_urn_uuid_xxxxxx">
      <address trace="disable" uri="http://myAPIendpoint " />
    </endpoint>
              </send>
    </inSequence>
    <outSequence>
      <log level="full"/>   
      <send/> 
    </outSequence>
    <faultSequence/>
  </target>
</proxy>

<?xml version="1.0" encoding="UTF-8"?>
<localEntry key="removeSOAP" xmlns="http://ws.apache.org/ns/synapse">
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
    xmlns:m="http://www.example.org/stock">
    <xsl:template match="/">
        <xsl:apply-templates select="soap:Envelope/soap:Body/*"/>
    </xsl:template>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
</localEntry>

2 个答案:

答案 0 :(得分:0)

一位同事今天发现了这一点,我在这里发布了答案,这有助于将来的某些人:

在代理服务中,在发送之前添加行

<property name="DISABLE_CHUNKING" value="true" scope="axis2"/>  

然后它有效。

不需要上面显示的XSLT转换,只需修改此行即可。

答案 1 :(得分:0)

如果你的后端是API更好,你可以使用http端点https://docs.wso2.com/display/ESB500/HTTP+Endpoint

     <send>
        <endpoint>
           <http method="POST"
                 uri-template="http://your.backend.endpoint.org/"/>
        </endpoint>
     </send>