首页 文章

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

提问于
浏览
1

我正在尝试使用CAMEL作为HTTP代理,我想从带有XML主体的传入HTTP消息中提取参数 . 这个参数我想在HTTP POST消息的头部添加到另一个 endpoints (另一个服务器) .

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

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

POST / webapp / createnewsubscription?subscriptionId = 1234567

我正在使用Spring DSL创建我的Camel路由 .

有人知道如何做到这一点?

谢谢,

一月

1 回答

  • 2

    我假设您想要使用XML作为有效负载POST到第一个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">
    

相关问题