Camel 服务调用给出 400 错误

问题描述 投票:0回答:1

我正在使用 Camel serviceCall 来呼叫我的 eureka VIP。主机和端口已按预期解析。但响应是 400 并且抛出错误。我的 serviceCall 如下所示:

    from("direct:servicecall")
    .setBody().constant(null)
    .setHeader(Exchange.HTTP_METHOD, constant(HttpMethods.GET))
    .serviceCall().name("eureka_vip_name")
    .expression()
    .simple("http4:${header.CamelServiceCallServiceHost}:${header.CamelServiceCallServicePort}"
        + "service call path and parameters")
    .end()

添加错误日志:

org.apache.camel.http.common.HttpOperationFailedException:HTTP 操作调用失败 http://172.31.20.241:8080/<------url path and parameteres------>,状态代码:400 在 org.apache.camel.component.http4.HttpProducer.populateHttpOperationFailedException(HttpProducer.java:312) ~[camel-http4-2.20.1.jar!/:2.20.1] 在 org.apache.camel.component.http4.HttpProducer.process(HttpProducer.java:207) ~[camel-http4-2.20.1.jar!/:2.20.1] 在 org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) ~[camel-core-2.20.1.jar!/:2.20.1] 在 org.apache.camel.processor.SendDynamicProcessor$1.doInAsyncProducer(SendDynamicProcessor.java:132) ~[camel-core-2.20.1.jar!/:2.20.1] 在 org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:445) ~[camel-core-2.20.1.jar!/:2.20.1] 在 org.apache.camel.processor.SendDynamicProcessor.process(SendDynamicProcessor.java:127) ~[camel-core-2.20.1.jar!/:2.20.1] 在 org.apache.camel.impl.cloud.DefaultServiceCallProcessor.execute(DefaultServiceCallProcessor.java:184) ~[camel-core-2.20.1.jar!/:2.20.1] 在 org.apache.camel.impl.cloud.DefaultServiceCallProcessor.lambda$process$0(DefaultServiceCallProcessor.java:164) ~[camel-core-2.20.1.jar!/:2.20.1] 在 org.apache.camel.spring.cloud.CamelSpringCloudServiceLoadBalancer.lambda$process$0(CamelSpringCloudServiceLoadBalancer.java:66) ~[camel-spring-cloud-2.20.1.jar!/:2.20.1] 在 org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:98) ~[spring-cloud-netflix-core-1.3.4.RELEASE.jar!/:1.3.4.RELEASE] 在 org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:80) ~[spring-cloud-netflix-core-1.3.4.RELEASE.jar!/:1.3.4.RELEASE] 在 org.apache.camel.spring.cloud.CamelSpringCloudServiceLoadBalancer.process(CamelSpringCloudServiceLoadBalancer.java:66) ~[camel-spring-cloud-2.20.1.jar!/:2.20.1] 在 org.apache.camel.impl.cloud.DefaultServiceCallProcessor.process(DefaultServiceCallProcessor.java:164) ~[camel-core-2.20.1.jar!/:2.20.1] 在 org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:76) ~[camel-core-2.20.1.jar!/:2.20.1] 在 org.apache.camel.processor.RedeliveryErrorHandler$AsyncRedeliveryTask.call(RedeliveryErrorHandler.java:203) ~[camel-core-2.20.1.jar!/:2.20.1] 在 org.apache.camel.processor.RedeliveryErrorHandler$AsyncRedeliveryTask.call(RedeliveryErrorHandler.java:171) ~[camel-core-2.20.1.jar!/:2.20.1] 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_161] 在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) ~[?:1.8.0_161] 在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) ~[?:1.8.0_161] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_161] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_161] 在 java.lang.Thread.run(Thread.java:748) [?:1.8.0_161]

我尝试使用 postMan (chrome 扩展)访问相同的 url:当从 postMan 访问时,我使用 ec2 实例 DNS 名称作为主机,它给了我预期的响应,即 200 OK 和预期的正文作为结果。

apache-camel httprequest
1个回答
0
投票

尝试回答这个问题事件,如果它是很久以前写的。

我遇到了同样的问题,并且我注意到这是由于在父/以前的路由中设置了一些额外的标头

例如,如果您在父路由中设置太长或采用不同格式(即 byte[])的标头,则该标头也会发送到 http 请求,并会产生 Http 400 错误代码。

在执行http请求之前,我通过使用 .removeHeaders("*") 删除所有标头来解决:

 from("direct:myHttpRoute")
        .removeHeaders("*", "PrefixToKeepSomeHeaders*") // clean headers         
        .setHeader(Exchange.HTTP_METHOD, constant("GET"))
        .setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
        .setBody().constant(null) // clean body
        .to("https://mypath.com")
        .log("Response: ${body}");

我希望这对其他人有用!

© www.soinside.com 2019 - 2024. All rights reserved.