Я изучаю WSO2 ESB и обнаружил проблему. Я использую простой прокси-сервер для отправки XML-данных из SAP (или Postman для тестирования), которые затем перенаправляются в REST API - должно быть легко!
Когда я отправляю POST прямо в REST API (не через ESB), он работает нормально. (200, ОК)
Но WSO2 ESB автоматически добавляет конверт SOAP, который REST API не принимает. Я пробовал различные подходы к удалению автоматически добавленного конверта SOAP, но безуспешно. Пробовал преобразование XSLT, формат POX, посредник Enrich и т. Д., Все предложения, которые я мог найти. (Я могу удалить элемент конверта с помощью XSLT, если он отправляется как часть тела, но не тот, который добавляет WSO2)
Я могу получить доступ к телу без конверта SOAP, используя:
<property name="body" expression="$body/*[1]" type="OM"/>
но я не знаю, как переслать это в API.
Есть идеи, как остановить добавление этого конверта в первую очередь в WSO2 ESB или как его удалить?
Я использовал код xslt из этого ответа, который отлично работает, когда я включаю теги SOAP в тело, но не влияет на конверт SOAP, который, кажется, автоматически добавляется в WSO2 (за исключением сообщения об ошибке ниже).
Пробовал разные варианты строчки:
<xsl:apply-templates select="soap:Envelope/soap:Body/*"/>
Такие как
<xsl:apply-templates select="soap:Envelope/*"/>
<xsl:apply-templates select="/*"/>
это ошибка, которую я вижу в журнале ESB:
Невозможно выполнить преобразование XSLT с использованием: Value {name = 'null', keyValue = 'DiscountPayment'} для исходного XPath: s11: Body / child :: [position () = 1] | s12: Body / child :: [position () = 1] причина: невозможно создать OMElement с использованием результата XSLT
Я новичок в 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>