Apache Camel :在http端点上启用bridgeEndpoint

3pmvbmvn  于 2023-01-17  发布在  Apache
关注(0)|答案(2)|浏览(250)

我创建了一个简单的路由来从远程主机获得联系。但是,关于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。

i7uq4tfw

i7uq4tfw1#

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},因为它看起来很多余,但是这取决于你想要实现什么。

shyt4zoc

shyt4zoc2#

@SubOptimal的答案几乎是正确的(我们可以说他的答案是次优的,哈哈),除了它应该是HTTP_URI标题。
如果bridgeEndpoint选项为true,则HttpProducer将忽略Exchange.HTTP_URI标头,并使用终结点的URI进行请求。
因此有两种解决方案:
1.将.removeHeader(Exchange.HTTP_URI)添加到路由定义
1.添加?bridgeEndpoint=true查询参数
然而,如果你有其他的头文件,这可能不能解决问题,也许这就是你的情况,这就是为什么删除所有 Camel http头文件帮助。
请注意,删除所有标头可能会破坏您的逻辑:例如HTTP_METHOD头文件被用来定义输出请求的http方法。如果你也想代理这个方法,那就由你决定了。你可以通过上面的链接在同一个文档中找到更多。

相关问题