簡體   English   中英

Apache-camel:在 http 端點上啟用 bridgeEndpoint

[英]Apache-camel: Enabling bridgeEndpoint on the http endpoint

我創建了一個簡單的路由來從遠程主機獲取聯系。 但是,對於 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);

該路由只是遠程主機的 get contact 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。我在這里缺少什么?

常見問題

在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} 因為它看起來多余。 但這取決於您想要實現的目標。

@SubOptimal 的回答幾乎是正確的,除了它應該是HTTP_URI標頭。 文檔

如果bridgeEndpoint 選項為true,HttpProducer 將忽略Exchange.HTTP_URI 標頭,並使用端點的URI 進行請求。

因此有2個解決方案:

  1. .removeHeader(Exchange.HTTP_URI)添加到路由定義
  2. 添加?bridgeEndpoint=true查詢參數

但是,如果您有其他標題妨礙,這可能無法解決問題。 可能這就是您的情況,這就是刪除所有 Camel http 標頭有幫助的原因。

請注意,刪除所有標頭可能會破壞您的邏輯:例如HTTP_METHOD標頭用於定義傳出請求的 http 方法。 如果您也想代理該方法,則取決於您。 您可以通過上面的鏈接在同一文檔中找到更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM