我正在探索 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>