使用包含Camel HTTP4下划线的URI

时间:2016-08-12 21:50:54

标签: http apache-camel uri apache-httpclient-4.x

我们正在尝试使用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

2 个答案:

答案 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连接。

最终,我的工作解决方案是建立第二层基础架构;网关代理,我们可以控制其主机名并确保其符合标准。我们在网关上设置了一个接近不良端点的端点。然后,我们将服务配置为改为与网关的端点联系,并确保它可以正常工作。