Apache Camel: как извлечь параметр из входящего HTTP-сообщения (с телом XML) - PullRequest
1 голос
/ 02 февраля 2012

Я пытаюсь использовать CAMEL в качестве HTTP-прокси, и я хотел бы извлечь параметр из входящего HTTP-сообщения с телом XML.Затем этот параметр я хотел бы добавить в заголовок сообщения HTTP POST к другой конечной точке (другому серверу).

Пример: тело XML содержит параметр с именем «subscriptionId».Значение этого поля «subscriptionId» затем будет использоваться в URI исходящего сообщения HTTP POST.

Так что, если subscriptionId = 1234567, я хочу, чтобы URI в сообщении HTTP POST было следующим:

POST / webapp / createnewsubscription? SubscriptionId = 1234567

Я использую Spring DSL для создания своих маршрутов Camel.

Кто-нибудь знает, как это сделать?

Спасибо,

Ян

1 Ответ

2 голосов
/ 03 февраля 2012

Я предполагаю, что вы хотите отправить первый URL с XML в качестве полезной нагрузки.

Сначала вам нужно будет использовать компонент XPath, чтобы получить значение для вашего XML-тега, а затем установитьBody для передачи параметра в прокси-запрос (опционально вы можете переключиться с POST на GET).

Что-то вроде этого должно работать:

<route>
  <from uri="jetty:http://127.0.0.1:8080/myapp"/>
  <setHeader headerName="subscriptionId">
    <xpath resultType="java.lang.String">//subscriptionId/text()</xpath>
  </setHeader>
  <!-- if you need to convert from POST to GET
  <setHeader headerName="CamelHttpMethod">
    <constant>GET</constant>
  </setHeader>
   -->
  <setBody> 
    <simple>subscriptionId=${in.headers.subscriptionId}</simple> 
 </setBody> 
  <to uri="jetty:http://127.0.0.1:8090/myapp?bridgeEndpoint=true&amp;throwExceptionOnFailure=false"/>
</route>

Вы должны быть в состоянии проверить это из командной строки, скажем, с помощью wget:

$ cat 1.txt
<a>
<subscriptionId>123</subscriptionId>
</a>

$ wget --post-file=1.txt --header="Content-Type:text/xml" http://127.0.0.1:8080/myapp

Вы можете использовать второй маршрут дляпротестируйте ответы, как это:

<route>
  <from uri="jetty:http://127.0.0.1:8090/myapp"/>
  <to uri="log:mylog?level=INFO"/>
  <setBody>
    <simple>OK: ${in.headers.CamelHttpMethod}: ${in.headers.subscriptionId}</simple>
  </setBody>      
</route>

И если вы установите camelContext в значение «trace», вы должны увидеть в своем журнале много информации о том, что происходит на каждом этапе обработки:

<camel:camelContext id="camel" trace="true" xmlns="http://camel.apache.org/schema/spring">
...