我们正在尝试使用Apache Camel
2.16.3将某些数据推送到第三方HTTP
端点。我们正在使用HTTP4
组件。我们将uri,方法和查询参数设置为消息中的标题。但是,端点包含下划线(_
),我们得到如下的异常:
引起:java.lang.IllegalArgumentException:无效的uri:https://x_y.something.com/somePath?q_one=XXXX&q_two=YYYYY。如果要转发/桥接http端点,则在端点上启用bridgeEndpoint选项:Endpoint [https4://占位符?throwExceptionOnFailure = false]
我一直在研究,看起来_
是URI中不应存在的东西。这个website实际上表示https://x_y.something.com/somePath
无效,但https://xy.something.com/somePath
有效。
由于我无法更改第三方端点,是否有可能以某种方式逃避下划线?如果没有,是否还有其他解决方案,或者我们需要放弃Apache Camel
?
答案 0 :(得分:2)
修改强>
在没有看到代码示例的情况下,我无法确定根本原因是什么,但如果我理解正确,那么您正在向使用Camel端点的akka actor发送HTTP请求。我的猜测是你可能没有正确填充标题 - 无论原始HTTP4
端点是什么样的,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");
所以我的猜测是,这不是骆驼问题。
答案 1 :(得分:0)
有点晚了,但是我将其留在这里以帮助将来的用户。
以前有这个确切的问题,我可以告诉你下划线是这里的罪魁祸首。您可能会发现,如果删除下划线,尽管您的服务(显然)将无法与端点联系,但它应正确解释URI。但是,如果错误仍然存在,则可能还必须添加bridgeEndpoint选项。
不幸的是,当我使用骆驼时,我从未找到一种便捷的方法来解决此限制。我开玩笑的一个想法是创建一个自定义的骆驼处理器来处理URI连接。
最终,我的工作解决方案是建立第二层基础架构;网关代理,我们可以控制其主机名并确保其符合标准。我们在网关上设置了一个接近不良端点的端点。然后,我们将服务配置为改为与网关的端点联系,并确保它可以正常工作。