Camel路由转发REST请求时响应返回原调用方丢失HTTP头问题
问题原因
- Camel Rest 消费者端点默认启用了响应头过滤策略,仅透传白名单内的标准HTTP头,自定义头、下游返回的非标准头默认都会被过滤丢弃,所以你在处理器中设置的头、原服务返回的头都无法传递到调用方。
- 下游HTTP服务返回的响应状态码存储在
CamelHttpResponseCode头中,Rest组件默认不会自动读取该头作为最终响应状态码,默认返回200状态码。 - HTTP生产者默认会过滤部分响应头,如果没有配置
bridgeEndpoint=true,下游返回的响应头不会全部带入Exchange中。 - 消息体不受默认过滤策略限制,所以你在处理器中设置的响应体可以正常返回。
解决方法
步骤1:配置Rest组件允许透传响应头
在路由配置类的configure方法中,首先添加Rest全局配置,关闭响应头过滤或者添加你需要透传的头到白名单:
@Override public void configure() throws Exception { // Rest全局配置 restConfiguration() // 允许所有响应头透传,也可以指定具体需要的头,比如"Link","test","Content-Type" .allowedResponseHeaders("*") // 可选:完全禁用头过滤策略,不过滤任何头 .setHeaderFilterStrategy(new HeaderFilterStrategy() { @Override public boolean applyFilterToCamelHeaders(String headerName, Object headerValue, Exchange exchange) { return false; } @Override public boolean applyFilterToExternalHeaders(String headerName, Object headerValue, Exchange exchange) { return false; } }); // 原有路由逻辑 ... }
步骤2:给HTTP生产者添加透传配置
在调用下游服务的toD地址后添加bridgeEndpoint=true和skipResponseHeaders=false参数,确保下游返回的所有响应头和状态码都被带回Exchange:
.toD(createProducerJoramConfiguration.getUrlDestination() + "?bridgeEndpoint=true&skipResponseHeaders=false")
步骤3:显式设置响应状态码
在toD之后添加状态码设置逻辑,将下游返回的状态码作为最终响应的状态码:
.setHeader(Exchange.HTTP_RESPONSE_CODE, header("CamelHttpResponseCode"))
修改完成后的完整路由示例
@Override public void configure() throws Exception { restConfiguration() .allowedResponseHeaders("*"); this.from(RestRouteBuilder.endPoint(createProducerJoramConfiguration)) .setExchangePattern(InOut) .removeHeader(Exchange.HTTP_URI) .toD(createProducerJoramConfiguration.getUrlDestination() + "?bridgeEndpoint=true&skipResponseHeaders=false") .setHeader(Exchange.HTTP_RESPONSE_CODE, header("CamelHttpResponseCode")) .setHeader("test", () -> "test") .process(createProducerJoramConfiguration.getProcessor()); }
内容的提问来源于stack exchange,提问作者user1823995
相关产品推荐
相关产品推荐

