通过路由传递查询参数

Pass query parameters through a route

这里是骆驼学习者。是否可以存储传入的查询参数并为各种路由设置各种 headers/query 参数?
我想使用身份验证选项构建类似代理的服务。示例:
1) 我在 http://foo.bar/path?login=admin&password=admin&action=delete
收到一个 HTTP 2) 然后我想使用一些 <to uri="direct:auth"/> 将请求发送到 http://auth.foo.bar/login?login=admin&password=admin 并接收身份验证令牌作为答案
3) 然后,用 token 执行一个动作:going to http://action.foo.bar/perform?authToken=sometoken&action=delete

最后 - 在进入 auth 路线之前是否可以选择 "cut" "action" 参数,然后在进入 action 之前追加它。谢谢。

您需要使用 Camel Jetty component to receive a HTTP request and the Camel HTTP4 component 向其他网络服务发出请求。

Jetty 组件将从客户端的调用中获取查询参数,并将它们放入 IN 交换的 headers 中,并与 HTTP 查询中的名称完全相同。

然后您可以通过设置 "CamelHttpQuery" header 来设置用于其他 HTTP 调用的查询参数(Exchange.HTTP_QUERY 是该字符串的静态最终变量)。下面我使用了 camel 提供的简单语言,它允许您将 headers 和 body 放入可用于设置 headers 的字符串中。来自 http 调用的响应将在交换的 body 中设置。

例如:

from("jetty:http://0.0.0.0:1234/path")
    .setHeader(Exchange.HTTP_QUERY,  simple("?login=${header.login}&password=${header.password}"))
    .to("http4://auth.foo.bar/login")
    .setHeader("authToken", simple("${body}")) //assuming just the token is in the response body
    .setBody("")
    .setHeader(Exchange.HTTP_QUERY,  simple("?authToken=${header.authToken}&action=${header.action}"))
    .to("http4://action.foo.bar/perform");

这是一个简单的示例,但显示了 header 和响应的放置位置。如果保持路由易于阅读不是那么简单,您可能希望将一些 header 设置和响应处理包装到 Camel 处理器中。

进一步回复:

要过滤 header 发送到 http 端点,请在您的 spring bean 定义中创建一个 org.apache.camel.spi.HeaderFilterStrategy 的实例,并将其添加到 .to("http://auth.foo.bar/?headerFilterStrategy=authHeaderFilterImpl") 像这样。 (这是来自 http4 页面)

我建议使用 http4 的原因是它的可定制性稍微好一些,但如果您可以从 http4 中找到您需要的等效功能,请随意坚持使用 jetty。

但是从阅读关于公开 POST 请求功能的文章中可以看出,auth 端点更像是一种 "enrich" 企业集成模式。查看 camel-enricher,它允许您访问另一个端点,然后将响应与原始交换聚合(或者如果您使用的是 camel 2.15 或更低版本,则使用具有聚合策略的收件人列表)。

否则,您可以将原始 post 请求 body 存储在 header 中,然后稍后将其用于实际操作调用。