提问者:小点点

使用包含下划线的URI与骆驼HTTP4


我们正在尝试使用Apache Camel2.16.3将一些数据推送到第三方HTTPendpoint。我们正在使用HTTP4组件。我们将uri、方法和查询参数设置为消息中的标头。但是,endpoint包含下划线(_),我们得到了这样的异常:

导致:java. lang.IllegalArgumentException:无效uri:https://x_y.something.com/somePath?q_one=XXXX

我一直在研究一点,它看起来像_是不应该在URI的东西。这个网站实际上说https://x_y.something.com/somePath是无效的,但是https://xy.something.com/somePath是有效的。

由于我无法更改第三方endpoint,是否有可能以某种方式转义下划线?如果没有,是否有其他解决方案或我们需要为此放弃Apache Camel


共2个答案

匿名用户

编辑在没有看到代码示例的情况下,我无法确定根本原因是什么,但如果我理解正确,您正在向正在从Camelendpoint消费的akka参与者发送HTTP请求。我的猜测是,您可能没有正确填充标头-不管原始HTTP4endpoint是什么样子,Exchange。HTTP_URI标头覆盖将始终优先。例如,这非常好:

from("jetty:http://localhost:9090/path")
    .routeId("jetty_server")
    .log("${body}");

from("timer:sender?delay=3000&period=5000")
    .setBody().constant("Ping!")
    .setHeader(Exchange.HTTP_URI, constant("http://localhost:9090/path"))
    .to("http4:x_y.something.com:9090/path?q_one=XXXX&q_two=YYYYY");

所以我猜这不是骆驼的问题。

匿名用户

有点晚了,但我会把这个留在这里以帮助未来的用户。

以前有过这个问题,我可以告诉你下划线可能是这里的罪魁祸首。您可能会发现,如果删除下划线,虽然您的服务(显然)无法联系endpoint,但它应该正确解释URI。但是,如果错误仍然存在,您可能还必须添加bridge geEndpoint选项。

不幸的是,当使用骆驼时,我从来没有找到一个方便的方法来绕过这个限制。我玩弄的一个想法是创建一个自定义骆驼处理器来处理URI连接。

最终,我的工作解决方案是建立第二个基础设施;网关代理,我们可以控制其主机名并确保其符合标准。我们在网关上设置了一个代理到坏endpoint的endpoint。然后我们将我们的服务配置为联系网关的endpoint,果然它起作用了。