Apache Camel:HTTP(和其他生产者)中的 URI 转义

发布于 2024-11-18 09:51:46 字数 765 浏览 3 评论 0原文

在 Apache Camel 路由中,我想获取多个标头并以安全的方式将它们组成 HTTP 查询字符串。我发现的唯一示例要么使用constant()(这对于构建动态查询字符串没有用),要么使用simple()(不提供URL 转义)。

例如,直接从 HTTP 组件的文档中获取以下代码片段:

   from("direct:start")
      .setHeader(Exchange.HTTP_QUERY, constant("order=123&detail=short"))
      .to("http://oldhost");

这是 90% 的方法,但是如果您并不总是想要订单 ID 123,该怎么办?我们希望能够在这里替换标头值。因此,下一个合乎逻辑的版本是切换到简单版本:

   from("direct:start")
    .setHeader(Exchange.HTTP_QUERY, simple("order=${header.orderId}&detail=short"))
    .to("http://oldhost");

但这有一个主要问题,即没有进行 URL 编码。这意味着 header.orderId 中的空格(或任何保留字符)会导致 HTTP 组件因无效查询字符串而引发异常。

因此,剩下的唯一方法是使用 JavaScript,对于这样的事情来说,这非常冗长,或者编写一个自定义处理器。看来这应该是内置的东西,所以我在这里询问是否缺少一种明显/正常的方法来完成我要做的事情 找这里吗?

In an Apache Camel route, I want to take several headers and compose them into an HTTP query string in a safe way. The only examples I've found either use constant(), which isn't useful for building dynamic query strings, or they use simple() which doesn't offer URL escaping.

For example, take the following snippet right from HTTP component's documentation:

   from("direct:start")
      .setHeader(Exchange.HTTP_QUERY, constant("order=123&detail=short"))
      .to("http://oldhost");

This is 90% of the way there, but what if you don't always want order id 123? We'd like to be able to substitute a header value here. So, the next logical version of this is to switch to simple:

   from("direct:start")
    .setHeader(Exchange.HTTP_QUERY, simple("order=${header.orderId}&detail=short"))
    .to("http://oldhost");

But this has the major issue of not being URL encoded. This means that a space (or any reserved character) in header.orderId results in an exception thrown by the HTTP component for an invalid query string.

So the only way that's left is to use JavaScript, which is very verbose for something like this, or to write a custom processor. It seems like this should be something that's built-in, so I'm asking here to see if I'm missing an obvious/normal way to do what I'm
looking for here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文