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