将包含下划线的URI与Camel HTTP4一起使用

将包含下划线的URI与Camel HTTP4一起使用,http,apache-camel,uri,apache-httpclient-4.x,Http,Apache Camel,Uri,Apache Httpclient 4.x,我们正在尝试使用ApacheCamel2.16.3将一些数据推送到第三方HTTP端点。我们正在使用HTTP4组件。我们正在将uri、方法和查询参数设置为消息中的头。但是,端点包含一个下划线(\uu),我们得到了如下异常: 原因:java.lang.IllegalArgumentException:无效uri:。如果要转发/桥接http端点,请在端点上启用bridgeEndpoint选项:endpoint[https4://placeholder?throweExceptionOnFailure=

我们正在尝试使用ApacheCamel2.16.3将一些数据推送到第三方
HTTP
端点。我们正在使用
HTTP4
组件。我们正在将uri、方法和查询参数设置为消息中的头。但是,端点包含一个下划线(
\uu
),我们得到了如下异常:

原因:java.lang.IllegalArgumentException:无效uri:。如果要转发/桥接http端点,请在端点上启用bridgeEndpoint选项:endpoint[https4://placeholder?throweExceptionOnFailure=false]

我已经做了一些研究,看起来
\uu
不应该出现在URI中。这实际上是说
https://x_y.something.com/somePath
无效,但
https://xy.something.com/somePath
无效

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

EDIT 在没有看到代码示例的情况下,我无法确定根本原因是什么,但如果我理解正确,您正在向akka参与者发送一个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");

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

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

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

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


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

您能否共享您创建的驼峰路线。我认为如果您添加
&bridgeEndpoint=true
,那么它应该开始不起作用的工作,因为我正在使用
Exchange.HTTP\u URI
在标题中设置
URI
。终结点没有有效的
URI
。另外,我没有
路线
,我使用的是
阿克卡骆驼
制作人。我尝试过,但没有解决问题。似乎这个问题比其他任何事情都更标准。。。那么,您可以分享一些关于参与者是如何开始的以及他们正在使用哪个端点URI的详细信息吗?如果您是设置URI的人,那么为什么不使用正确的URI呢?演员在哪里?如果路线是这样的话,你能确认它会工作吗<代码>从(“计时器:发送方?延迟=3000&周期=5000”).setBody().constant(“Ping!”).setHeader(Exchange.HTTP_URI,constant(“https://x_y.something.com:9090/path)到(“https4:something.com:9090/path?q_one=XXXX&q_two=yyyy”)嗯,不是,因为头覆盖了http4端点中的URI。您可以更改哪个参数?