[英]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個解決方案:
.removeHeader(Exchange.HTTP_URI)
添加到路由定義?bridgeEndpoint=true
查詢參數但是,如果您有其他標題妨礙,這可能無法解決問題。 可能這就是您的情況,這就是刪除所有 Camel http 標頭有幫助的原因。
請注意,刪除所有標頭可能會破壞您的邏輯:例如HTTP_METHOD
標頭用於定義傳出請求的 http 方法。 如果您也想代理該方法,則取決於您。 您可以通過上面的鏈接在同一文檔中找到更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.