我创建了一个简单的路由来从远程主机获得联系。但是,关于bridgeEndpoint选项似乎有很多混乱。
最初,我使用JavaDSL添加路由,如下所示:
from("direct:getContact")
.marshal().json(JsonLibrary.Jackson)
.setHeader("Content-Type", constant("application/json"))
.setHeader("Accept", constant("application/json"))
.setHeader(Exchange.HTTP_METHOD, constant("GET"))
.recipientList(simple("http://<remoteHost>:8080/api/contact" +
"/${header.contactId}"))
.unmarshal().json(JsonLibrary.Jackson);
此路由只是远程主机的获取联系人API的代理。我收到以下错误:
Invalid uri: /ib/contact/51702/contact/51702. If you are forwarding/bridging http endpoints, then enable the bridgeEndpoint option on the endpoint: Endpoint[http://<remoteHost>:8080/api/contact/51702]
您看到的/ib/* 是tomcatservlet的基本URL,按照错误中的建议,我将bridgeEndpoint=true添加到端点,如下所示:
from("direct:getContact")
.marshal().json(JsonLibrary.Jackson)
.setHeader("Content-Type", constant("application/json"))
.setHeader("Accept", constant("application/json"))
.setHeader(Exchange.HTTP_METHOD, constant("GET"))
.recipientList(simple("http://<remoteHost>:8080/api/contact" +
"/${header.contactId}?bridgeEndpoint=true"))
.unmarshal().json(JsonLibrary.Jackson);
然后,我得到一个不同的错误:
org.apache.camel.component.http.HttpOperationFailedException:
HTTP operation failed invoking
http://<remoteHost>:8080/api/contact/51702/contact/51702 with statusCode: 404
at org.apache.camel.component.http.HttpProducer.populateHttpOperationFailedException(HttpProducer.java:233)
at org.apache.camel.component.http.HttpProducer.process(HttpProducer.java:158)
at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:652)
at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:580)
at org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:227)
at org.apache.camel.processor.RecipientList.sendToRecipientList(RecipientList.java:167)
at org.apache.camel.processor.RecipientList.process(RecipientList.java:120)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)
它仍然将“contact/51702”附加到远程主机的url,这将给出404。
2条答案
按热度按时间i7uq4tfw1#
从FAQ
在camel中,有许多组件使用http协议头来完成它们的业务。
我相信你的制作人也是这样做的。所以下面的内容可以解决你的问题。
你也可以从端点中删除
contact/${header.contactId}
,因为它看起来很多余,但是这取决于你想要实现什么。shyt4zoc2#
@SubOptimal的答案几乎是正确的(我们可以说他的答案是次优的,哈哈),除了它应该是
HTTP_URI
标题。如果bridgeEndpoint选项为true,则HttpProducer将忽略Exchange.HTTP_URI标头,并使用终结点的URI进行请求。
因此有两种解决方案:
1.将
.removeHeader(Exchange.HTTP_URI)
添加到路由定义1.添加
?bridgeEndpoint=true
查询参数然而,如果你有其他的头文件,这可能不能解决问题,也许这就是你的情况,这就是为什么删除所有 Camel http头文件帮助。
请注意,删除所有标头可能会破坏您的逻辑:例如
HTTP_METHOD
头文件被用来定义输出请求的http方法。如果你也想代理这个方法,那就由你决定了。你可以通过上面的链接在同一个文档中找到更多。