Apache Camel:在HTTP端点上启用bridgeEndpoint

15

我创建了一个简单的路由来从远程主机获取联系人。但是,关于bridgeEndpoint选项似乎存在很多困惑。

最初,我使用Java DSL添加了以下路由:

        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/*是Tomcat Servlet的基本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个回答

15

来自FAQ

在Camel中,有许多组件使用HTTP协议头来完成其业务。

我相信您的生产者也是这样做的。因此,以下内容可以解决您的问题。


from("direct:getContact")
    .marshal().json(JsonLibrary.Jackson)
    .setHeader("Content-Type", constant("application/json"))
    .setHeader("Accept", constant("application/json"))
    .setHeader(Exchange.HTTP_METHOD, constant("GET"))
    .removeHeader(Exchange.HTTP_PATH)
    .recipientList(simple("http://<remoteHost>:8080/api/contact" +
        "/${header.contactId}?bridgeEndpoint=true"))
    .unmarshal().json(JsonLibrary.Jackson);

您也可以从端点中删除contact/${header.contactId},因为它看起来是多余的。但这取决于您想要实现什么。


3
谢谢,这个可行。阅读了常见问题解答后,我移除了所有的HTTP头信息.removeHeaders("CamelHttp*")。然后我发现我不需要启用bridgeEndpoint。.recipientList(simple("http://<remoteHost>:8080/api/contact" + "/${header.contactId}")) 就可以正常工作。 - ndsurendra
3
?bridgeEndpoint=true 解决了我的 Mattermost 连接问题。 - bobbel

8
@SubOptimal的回答几乎正确(可以说他的回答是次优的,哈哈),但应该使用HTTP_URI头而非HTTP_URL头。从文档中得知:

如果bridgeEndpoint选项为true,则HttpProducer将忽略Exchange.HTTP_URI头并使用端点的URI进行请求。

因此有两种解决方法:
  1. 在路由定义中添加.removeHeader(Exchange.HTTP_URI)
  2. 添加?bridgeEndpoint=true查询参数。
然而,如果存在干扰的其他头,这可能无法解决问题。很可能你的情况就是这样,这就是为什么删除所有Camel http头有所帮助的原因。
请注意,删除所有标头可能会破坏您的逻辑。例如,在向外发出的请求中,HTTP_METHOD头用于定义http方法。您可以自行决定是否也代理方法,您可以通过上述链接在同一文档中找到更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接