当 Rest Request URI 太长时,通过 apache Camel 的 GET HTTP 操作失败
GET HTTP operation via apache Camel fails when Rest Request URI too long
我在我的项目中使用 apache rest CXF 和 camel。在许多情况下,rest 的请求 URI 的长度太长,并且在一定长度后骆驼总是尽管 HTTP 操作失败异常,如下所示
statusCode: 400
at org.apache.camel.component.http.HttpProducer.populateHttpOperationFailedException(HttpProducer.java:230) ~[camel-http-2.13.1.jar:2.13.1]
at org.apache.camel.component.http.HttpProducer.process(HttpProducer.java:156) ~[camel-http-2.13.1.jar:2.13.1]
at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:113) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:118) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:80) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.ChoiceProcessor.process(ChoiceProcessor.java:111) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) ~[camel-core-2.13.1.jar:2.13.1]l
at org.apache.camel.processor.ChoiceProcessor.process(ChoiceProcessor.java:111) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:118) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:80) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.component.seda.SedaConsumer.sendToConsumers(SedaConsumer.java:291) [camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.component.seda.SedaConsumer.doRun(SedaConsumer.java:200) [camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.component.seda.SedaConsumer.run(SedaConsumer.java:147) [camel-core-2.13.1.jar:2.13.1]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_101]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_101]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_101]
那么有没有什么办法,我们可以在发送请求之前在header中显式传递长度参数,或者通过任何其他配置来设置请求URI的最大长度。对于解决方法,我只是用 HttpConnection 替换了 camel 调用并且它工作正常,这意味着 camel 对请求的 URI 长度有一些限制。
我在 link
提交了请求
骆驼代码:
.choice()
.when(header(ReservationConstant.CALL_ENDECA_FOR_LAR_FACETS).isEqualTo(Boolean.TRUE))
.setHeader(Exchange.HTTP_METHOD, constant(org.apache.camel.component.http4.HttpMethods.GET))
.setHeader(Exchange.HTTP_PATH, constant(ReservationConstant.ENDECA_GUIDED_SEARCH_SERVICE))
.setBody(simple(StringUtils.EMPTY))
//.to("cxfrs:bean:endecaLocationKeyRSClient?throwExceptionOnFailure=false")
.to("{{service.endeca.location.dimension.rest}}")
//.process(endecaFacetProcessor)
.bean(EndecaResponseBuilder.class, "getEndecaResponseForLARFacets")
.end()
问题似乎不是因为 URI 太长,而是因为在我删除 header 它开始工作后,我请求中的 header 之一太大了
我在我的项目中使用 apache rest CXF 和 camel。在许多情况下,rest 的请求 URI 的长度太长,并且在一定长度后骆驼总是尽管 HTTP 操作失败异常,如下所示
statusCode: 400
at org.apache.camel.component.http.HttpProducer.populateHttpOperationFailedException(HttpProducer.java:230) ~[camel-http-2.13.1.jar:2.13.1]
at org.apache.camel.component.http.HttpProducer.process(HttpProducer.java:156) ~[camel-http-2.13.1.jar:2.13.1]
at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:113) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:118) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:80) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.ChoiceProcessor.process(ChoiceProcessor.java:111) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) ~[camel-core-2.13.1.jar:2.13.1]l
at org.apache.camel.processor.ChoiceProcessor.process(ChoiceProcessor.java:111) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:118) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:80) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) ~[camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.component.seda.SedaConsumer.sendToConsumers(SedaConsumer.java:291) [camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.component.seda.SedaConsumer.doRun(SedaConsumer.java:200) [camel-core-2.13.1.jar:2.13.1]
at org.apache.camel.component.seda.SedaConsumer.run(SedaConsumer.java:147) [camel-core-2.13.1.jar:2.13.1]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_101]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_101]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_101]
那么有没有什么办法,我们可以在发送请求之前在header中显式传递长度参数,或者通过任何其他配置来设置请求URI的最大长度。对于解决方法,我只是用 HttpConnection 替换了 camel 调用并且它工作正常,这意味着 camel 对请求的 URI 长度有一些限制。
我在 link
提交了请求骆驼代码:
.choice()
.when(header(ReservationConstant.CALL_ENDECA_FOR_LAR_FACETS).isEqualTo(Boolean.TRUE))
.setHeader(Exchange.HTTP_METHOD, constant(org.apache.camel.component.http4.HttpMethods.GET))
.setHeader(Exchange.HTTP_PATH, constant(ReservationConstant.ENDECA_GUIDED_SEARCH_SERVICE))
.setBody(simple(StringUtils.EMPTY))
//.to("cxfrs:bean:endecaLocationKeyRSClient?throwExceptionOnFailure=false")
.to("{{service.endeca.location.dimension.rest}}")
//.process(endecaFacetProcessor)
.bean(EndecaResponseBuilder.class, "getEndecaResponseForLARFacets")
.end()
问题似乎不是因为 URI 太长,而是因为在我删除 header 它开始工作后,我请求中的 header 之一太大了