Apache Camel:将HTTP查询字符串参数作为标头?

5

我是camel的新手,更喜欢使用Spring DSL来定义路由。现在我发现很困惑的一点就是http查询字符串参数被命名并处理为头部信息,但它们实际上不是。这是否是camel中的架构错误?

3个回答

7

传入的http请求将作为具有与查询参数相同名称的标题添加到交换中。

以下示例来自骆驼文档:

例如,给定一个客户端请求URL, http://myserver/myserver?orderid=123,交换将包含一个名为orderid的标题,其值为123。

您可以通过设置CamelHttpQuery标头来为其他HTTP调用设置查询参数。Exchange.HTTP_QUERY是字符串CamelHttpQuery的静态常量。

例如:

from("jetty://0.0.0.0:8080/test")
    .setHeader(Exchange.HTTP_QUERY, simple("?param1=${header.param1}")
    .to("http://external-url/test")

1
我并不觉得它非常优雅,而且它实际上并没有回答我的问题,但我很高兴有人回答并且它有效 :) - Jundl
8
对我而言,我必须使用简单的语法:"param1=${header.param1}",没有问号。 - Erik Pearson
如果没有疑问,正确的写法是.setHeader(Exchange.HTTP_QUERY, constant("order=123&detail=short"))。该文档中没有问号。 - WesternGun

2
您可以使用toD。例如:
from("direct:mycode")
  .toD("https://myurl?param1=${header.param1}");

0

另一种解决方法是使用 toD 组件(SendDynamicProcessor),并在内部使用 http4 组件调用 URL。

使用 camel-http4 2.X.X。从 Camel 3.X 开始,http4 合并到了 http。

我分享了一种通用且可控制几个方面的方法。

  1. 可以动态设置uri。
  2. 可以在需要时动态添加参数。
  3. 您可以使用几个配置值(标题、正文、GET/POST、查询参数等)调用此路由以调用不同的端点。

    <!-- param将是List或ArrayString key=value,并对其进行toString以创建格式为key1=value1&key2=value2的查询-->
    <route id="httpInvoker">
       <from uri="direct:httpInvoker"/>
       <setHeader headerName="CamelHttpQuery"><simple>ref:param_bean<simple></setHeader>
       <setHeader headerName="CamelHttpUri"><simple>ref:uri_bean<simple></setHeader>
       <toD uri="http4:\\some-example.com">
    <route>
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接