WSO2 esb: как проксировать службу REST с числовым именем операции

Мы пытаемся реализовать базовую прокси-службу SOAP-to-REST на WSO2 ESB. Наша сторонняя служба REST принимает запросы в следующем формате:

http://<MYURL>/simpleQuery/16783484?oslc.select=value1

Проблема в том, что имя операции имеет только числовой формат - в нашем случае «16783484». Медиатор payloadFactory не позволяет иметь ‹16783484> в качестве элемента XML, поскольку спецификация XML ограничивает имена элементов только числовыми.

<proxy xmlns="http://ws.apache.org/ns/synapse" name="CQProxy" transports="https,http" statistics="disable" trace="disable" startOnLoad="true">
   <target>
      <inSequence>
         <payloadFactory>
            <format>
               <16783484>
                  <oslc.select>$1</oslc.select>
               </16783484>
            </format>
            <args>
               <arg value="myvalue1"/>
            </args>
         </payloadFactory>
         <send>
            <endpoint>
               <address uri="http://<MYURL>/simpleQuery" format="get"/>
            </endpoint>
         </send>
         <drop/>
      </inSequence>
      <outSequence>
         <log level="full"/>
         <send/>
      </outSequence>
   </target>
</proxy>

Как это преодолеть?

Благодарю за помощь!


person Alex Yakimovich    schedule 28.02.2013    source источник


Ответы (2)


Служба поддержки WSO2 предложила следующее решение. Спасибо, Сандапа!

В этом случае вы должны установить формат конечной точки как «отдых». И если это запрос GET, вы должны установить HTTP_METHOD как GET. См. Пример, приведенный ниже.

Пример:

<proxy xmlns="http://ws.apache.org/ns/synapse" name="CQProxy" transports="https,http" statistics="disable" trace="disable" startOnLoad="true">
   <target>
      <inSequence>
         <property name="REST_URL_POSTFIX" value="/getSimpleQuote?symbol=IBM" scope="axis2" type="STRING"/>
         <property name="HTTP_METHOD" value="GET" scope="axis2" type="STRING"/>
         <send>
            <endpoint>
               <address uri="http://localhost:9000/services/SimpleStockQuoteService/" format="rest"/>
            </endpoint>
         </send>
         <drop/>
      </inSequence>
      <outSequence>
         <log level="full"/>
         <send/>
      </outSequence>
   </target>
   <description></description>
</proxy>
person Alex Yakimovich    schedule 08.03.2013
comment
Интересно, почему это не помечено как правильный ответ. Я пробовал это, и это правильно. - person Amila Maharachchi; 16.04.2013

Хотя этот комментарий не предлагает вам решения, я могу сказать, что это плохая идея :-) Вы можете попробовать использовать XSLT вместо PayloadFactory для преобразования, но опять же это может заблокировать синтаксический анализатор XML. Проблема заключается в большом количестве проектов / библиотек с открытым исходным кодом, которые используются продуктами WSO2, и вы можете столкнуться с ними в другом месте, чтобы соблюсти спецификацию. В конечном итоге соблюдение спецификации избавит вас от головной боли при интеграции с другими внешними инструментами / системами. Можно ли изменить службу отдыха так, чтобы в названии службы хотя бы был знак подчеркивания впереди?

person Chintana Wilamuna    schedule 01.03.2013
comment
У посредника XSLT будет та же проблема Чинтана. К сожалению, я не могу изменить REST API, поскольку он является частью продукта COTS. Но насколько я знаю, спецификация REST не требует, чтобы имя операции соответствовало каким-либо стандартам, верно? Разрешает ли WSO2 ESB перенаправление на службу REST путем жесткого кодирования имени операции в URL-адресе конечной точки и удаления содержимого сообщения SOAP? Это подход, который использует Mule ESB. - person Alex Yakimovich; 01.03.2013