Proxy ApacheCamel:如何从传入的HTTP消息中提取参数(带有XML正文)

Proxy ApacheCamel:如何从传入的HTTP消息中提取参数(带有XML正文),proxy,apache-camel,Proxy,Apache Camel,我正在尝试使用CAMEL作为HTTP代理,我想从传入的带有XML主体的HTTP消息中提取一个参数。然后,我想将此参数添加到指向另一个端点(另一台服务器)的HTTP POST消息的头中 示例:XML正文包含一个名为“subscriptionId”的参数。然后,此字段“subscriptionId”的值将用于传出HTTP POST消息的uri中 因此,如果subscriptionId=1234567,我希望HTTP POST消息中的uri如下所示: POST/webapp/createnewsubs

我正在尝试使用CAMEL作为HTTP代理,我想从传入的带有XML主体的HTTP消息中提取一个参数。然后,我想将此参数添加到指向另一个端点(另一台服务器)的HTTP POST消息的头中

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

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

POST/webapp/createnewsubscription?subscriptionId=1234567

我正在使用SpringDSL创建骆驼路线

有人知道怎么做吗

谢谢


Jan

我猜您想发布到第一个URL,并使用XML作为有效负载

首先,您需要使用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>

//subscriptionId/text()
subscriptionId=${in.headers.subscriptionId}
您应该能够从命令行测试它,比如使用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
$cat 1.txt
123
$wget--post file=1.txt--header=“内容类型: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>

确定:${in.headers.CamelHttpMethod}:${in.headers.subscriptionId}
如果您将camelContext设置为“trace”,您应该会在日志中看到处理过程中每个步骤的大量信息:

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


您可能应该接受上一个问题的答案。这将激励更多的人回答这个问题。嗨,maximdim,我确实回答了我在上一个问题上得到的回答(“非常感谢!”等等:)。我应该做些什么来结束这个话题吗?如果你对答案感到满意,你需要将其标记为“已接受”-请参见问题左侧的复选标记。完成!现在,让我们希望一些人能回答这个新问题:)。太好了!正是我想要的。我将测试它,然后让你知道它是如何进行的。再次感谢。