You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WebClient响应中覆盖任意HttpHeader?含Content-Type修正场景

解决WebClient中修改只读响应Headers的问题

你遇到的问题核心在于ClientResponse是不可变对象,它的Headers默认是只读的,所以不能直接修改。不过Spring WebClient提供了mutate()方法,让你可以创建一个响应的副本并修改其中的属性,包括Headers。

下面是修改后的contentTypeInterceptor()实现,不仅能修正Content-Type,还能通用地修改任意HttpHeader:

private ExchangeFilterFunction contentTypeInterceptor() {
    return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
        // 1. 复制原响应的HttpHeaders,因为原Headers是只读的
        HttpHeaders modifiedHeaders = new HttpHeaders();
        modifiedHeaders.addAll(clientResponse.headers().asHttpHeaders());
        
        // 2. 修改目标Header,这里替换Content-Type为正确的application/xml
        modifiedHeaders.setContentType(MediaType.APPLICATION_XML);
        // 如果要修改其他Header,比如添加或替换,都可以在这里操作
        // modifiedHeaders.set("X-Custom-Header", "new-value");
        
        // 3. 通过mutate()创建新的ClientResponse,替换headers
        ClientResponse modifiedResponse = clientResponse.mutate()
                .headers(headers -> headers.addAll(modifiedHeaders))
                .build();
        
        return Mono.just(modifiedResponse);
    });
}

关键说明:

  • 不可变对象处理:clientResponse.mutate()会返回一个ClientResponse.Builder,通过它可以修改响应的各种属性,包括headers、status等。
  • Header复制:先把原响应的headers全部复制到新的HttpHeaders对象中,这样可以保留其他原有header,只修改需要调整的部分。
  • 通用修改:如果需要修改其他任意Header,只需要在modifiedHeaders上调用对应的set()、add()等方法即可,非常灵活。

这样修改后,WebClient在后续解析响应体时,就会使用你修正后的application/xml Content-Type,Jackson就能正常解析MyResponse类型,不会再抛出UnsupportedMediaTypeException了。

内容的提问来源于stack exchange,提问作者membersound

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:10:13