Запрос ESB Proxy XML внутри тега CDATA в запросе SOAP - PullRequest
0 голосов
/ 13 декабря 2018

Я новичок в Apache Synapse.Мне нужно сделать основанную на контенте маршрутизацию и проксирование службы SOAP.Однако фактическим запросом является документ XML внутри тега CDATA в теле запроса SOAP.После маршрутизации на основе содержимого этого документа мне нужно использовать посредник XQuery для преобразования документа и вызова прокси-службы.Я не могу изменить WSDL этого запроса.Можно ли выполнять маршрутизацию и преобразование документа, который находится внутри тегов CDATA?Когда я регистрирую запрос из Synapse, я вижу, что XML внутри CDATA был экранирован.Я видел несколько постов, описывающих сохранение CDATA, но я не уверен, что я мог бы сделать с ним в любом случае.

Запрос выглядит примерно так:Мне нужно направить сообщение на основе атрибута TypeOfRequest:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:svc="http://integration.myservice.com">
   <soapenv:Header/>
   <soapenv:Body>
      <svc:Execute>
         <svc:myservice>
             <![CDATA[
             <?xml version="1.0" encoding="UTF-8"?>
            <myservice xmlns="http://integration.myservice.com">
                <Request TypeOfRequest="type1" RequestID="1" Echo="false">
                    <Message>
                        <Tag1510>
                            <TypeCode>10</TypeCode>
                            <SubTypeCode>00</SubTypeCode>
                        </Tag1510>
                        <Tag2000>
                            <Amount>
                                <Amount>1.00</Amount>
                            </Amount>
                        </Tag2000>
                    </Message>
                </Request>
            </myservice>
            ]]>
        </svc:myservice>
      </svc:Execute>
   </soapenv:Body>
</soapenv:Envelope> 

1 Ответ

0 голосов
/ 17 декабря 2018

Обычно вы можете использовать xslt для удаления блока CDATA.В этом случае <?xml ..?> вызовет проблемы, но я думаю, что мне удалось решить, что с помощью substring я не смог это проверить (редактировать: но работает в соответствии с отзывами ниже) https://xsltfiddle.liberty -развитие.net / pPqsHUz / 1

Альтернативой может быть использование посредника сценариев для выполнения строковой магии в javascript для извлечения части между myservice и / myservice

РЕДАКТИРОВАТЬ:добавил XSLT ниже, на случай, если ссылка xsltfiddle перестанет работать:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0" xmlns:svc="http://integration.myservice.com"
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

  <!-- match all elements that are not 'svc:myservice' and ignore -->
  <xsl:template match="@* | node()">
        <xsl:apply-templates select="@* | node()"/>
  </xsl:template>

  <!-- match svc:myservice and copy the entire CDATA string after the ?xml line -->
  <xsl:template match="svc:myservice">
     <xsl:copy>
       <xsl:value-of select="substring-after(., '?>')" disable-output-escaping="yes"/>
     </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
...