Camel在响应原始调用方时丢失HTTP标头

zengzsys  于 2022-11-07  发布在  Apache
关注(0)|答案(2)|浏览(214)

我已经创建了一个路由来转发REST调用,一切都很顺利,除了我不能修改响应的HTTP头(实际上我甚至不能在响应中原封不动地修改它们)。

// My processor
private void remplacerLiensDansHeader(final Exchange exchange, final String rootUrlPivotJoram, final String rootUrlRemplacement) {
    // That is OK, I get the values just fine
    ArrayList<String> oldLinks = exchange.getIn().getHeader(HEADER_LINK, ArrayList.class);

    // This is also OK
    final List<String> newLinks = anciensLiens.stream().map(lien -> lien.replace(rootUrlPivotJoram, rootUrlRemplacement)).collect(toList());

    // No error, but apparently doesn't work
    exchange.getMessage().setHeader(HEADER_LINK, newLinks);
    exchange.getMessage().setHeader("test", "test");
}

// Route configuration
@Override
public void configure() throws Exception {
    this.from(RestRouteBuilder.endPoint(createProducerJoramConfiguration))
        .setExchangePattern(InOut)
        .removeHeader(Exchange.HTTP_URI)
        .toD(createProducerJoramConfiguration.getUrlDestination())
        .setHeader("test", () -> "test") // that doesn't work either
        .process(createProducerJoramConfiguration.getProcessor()); // this is the processor with the code above
}

这是我得到的响应(请注意,响应代码是200,我认为这很奇怪,因为原始代码是201
第一个
我注意到两件事:

  • 如果我在处理器中添加了一个主体,那么该主体就会出现在响应中,
  • 如果我删除处理器,“原始响应”中的头也不存在。
t30tvxxf

t30tvxxf1#

我不知道你到底失去了什么头文件,但要知道Camel HTTP component有一个默认的头文件过滤器(就像很多Camel组件一样)。
如果不指定自己的HeaderFilterStrategy,则使用默认的HttpHeaderFilterStrategy
此默认值筛选以下标头:

  • 内容长度
  • 内容类型
  • 宿主
  • 高速缓存控制
  • 连接
  • 日期
  • 编译指示
  • 拖车
  • 传输编码
  • 升级
  • 通孔
  • 警告
  • 驼色 *
  • apache.camel* 的数据库

使用此过滤器,Camel希望避免旧的HTTP标头仍然出现在传出的请求中(可能带有错误的数据)。
对Camel头的过滤只是为了删除与HTTP无关的Camel特定内容。

zpjtge22

zpjtge222#

实际上,问题出在cxfrs组件。
我们设法在这里找到一个答案:请参阅:Response to REST client from Camel CXFRS route?
这是最终的解决方案。
感谢每一个寻找答案的人,我希望这能帮助到其他人。

public class ModificationHeaderLinkProcessor implements Processor {

  private static final String HEADER_LINK = "Link";

  @Override
  public void process(final Exchange exchange) {
    List<String> newLinks= getNewLinks(exchange, oldUrl, newUrl);
    ResponseBuilder builder = createHttpResponse(exchange);
    builder.header(HEADER_LINK, newLinks);
    exchange.getIn().setBody(builder.build());
  }

  private List<String> getNewLinks(final Exchange exchange, final String oldUrl, final String newUrl) {
    ArrayList<String> oldLinks= exchange.getIn().getHeader(HEADER_LINK, ArrayList.class);
    return oldLinks.stream().map(link-> link.replace(oldUrl, newUrl)).collect(toList());
  }

  private ResponseBuilder createHttpResponse(final Exchange exchange) {
    ResponseBuilder builder = Response.status(getHttpStatusCode(exchange))
                                      .entity(exchange.getIn().getBody());
    clearUselessHeader(exchange);
    exchange.getIn().getHeaders().forEach(builder::header);
    return builder;
  }

  private void clearUselessHeader(final Exchange exchange) {
    exchange.getIn().removeHeader(HEADER_LINK);
    exchange.getIn().removeHeaders("Camel*");
  }

  private Integer getHttpStatusCode(final Exchange exchange) {
    return exchange.getIn().getHeader(exchange.HTTP_RESPONSE_CODE, Integer.class);
  }

  private final String getPropertiesValue(CamelContext camelContext, String key) {
    return camelContext.getPropertiesComponent().resolveProperty(key).orElseThrow();
  }
}

相关问题