首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache-camel:在http端点上启用bridgeEndpoint

Apache-camel:在http端点上启用bridgeEndpoint
EN

Stack Overflow用户
提问于 2016-06-02 16:27:58
回答 2查看 13.8K关注 0票数 9

我创建了一个从远程主机获取联系的简单路由。但是,关于bridgeEndpoint选项似乎有很多混淆。

最初,我使用Java DSL添加了路由,如下所示:

代码语言:javascript
复制
        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);

此路由只是远程主机的get contact API的代理。我得到了以下错误:

代码语言:javascript
复制
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添加到端点,如下所示:

代码语言:javascript
复制
        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);

然后,我得到一个不同的错误:

代码语言:javascript
复制
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。这里我漏掉了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-02 21:25:37

FAQ

在camel中,有许多组件使用

协议头来完成它们的业务。

我相信你的制片人也是这样做的。所以下面的方法可以解决你的问题。

代码语言:javascript
复制
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}。因为它看起来是多余的。但这取决于你想要实现什么。

票数 9
EN

Stack Overflow用户

发布于 2020-06-17 00:04:44

@SubOptimal的答案几乎是正确的,除了它应该是HTTP_URI标头。来自the doc

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

因此,有两种解决方案:

  1. .removeHeader(Exchange.HTTP_URI)添加到路由定义
  2. 添加?bridgeEndpoint=true查询参数

然而,如果你有其他的头文件,这可能不能解决问题。也许这就是你的情况,这就是为什么移除所有Camel http头文件会有帮助。

但是请注意,删除所有头部可能会破坏您的逻辑:例如,HTTP_METHOD头部用于定义传出请求的http方法。如果你也想要代理这个方法,这取决于你。您可以通过上面的链接在同一文档中找到更多信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37586488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档