我们正在尝试使用Apache Camel
2.16.3将一些数据推送到第三方HTTP
endpoint。我们正在使用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
?
编辑在没有看到代码示例的情况下,我无法确定根本原因是什么,但如果我理解正确,您正在向正在从Camelendpoint消费的akka参与者发送HTTP请求。我的猜测是,您可能没有正确填充标头-不管原始HTTP4
endpoint是什么样子,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,果然它起作用了。