Apache Camel:如何从传入的HTTP消息中提取参数(使用XML正文)

时间:2012-02-02 17:14:05

标签: proxy apache-camel

我正在尝试将CAMEL用作HTTP代理,我想从带有XML主体的传入HTTP消息中提取参数。这个参数我想在HTTP POST消息的标题中添加到另一个端点(另一个服务器)。

示例:XML正文包含一个名为“subscriptionId”的参数。然后,此字段“subscriptionId”的值将用于传出HTTP POST消息的URI。

因此,如果subscriptionId = 1234567,我希望HTTP POST消息中的uri如下:

POST / webapp / createnewsubscription?subscriptionId = 1234567

我正在使用Spring DSL来创建我的Camel路线。

任何人都知道如何做到这一点?

谢谢,

1 个答案:

答案 0 :(得分:2)

我认为您希望使用XML作为有效负载PO​​ST到第一个URL。

首先,您需要使用XPath组件获取XML标记的值,然后使用setBody将参数传递给代理请求(可选择您可以从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">