0

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

当我直接发布到 REST API(不是通过 ESB)时,它工作正常。(200,好的)

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

我可以使用以下方法访问正文,无需 SOAP 信封:

<property name="body" expression="$body/*[1]" type="OM"/>

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

任何想法如何停止在 WSO2 ESB 中首先添加这个信封,或者如何删除它?

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

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

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

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

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

无法使用:值 {name ='null', keyValue ='discountPayment'} 对源 XPath 执行 XSLT 转换:s11:Body/child:: [position()=1] | s12:Body/child:: [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>

4

2 回答 2

1

一位同事今天发现了这一点,我在这里发布答案,以防将来对某人有所帮助:

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

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

然后它工作。

不需要上面显示的 XSLT 转换,只需这一行即可修复它。

于 2017-02-16T13:42:12.343 回答
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>
于 2017-02-16T18:04:14.557 回答