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

Spring Reactive WebClient发起GET请求返回无效HTML乱码问题排查

WebClient请求返回乱码问题排查与解决

问题现象

发起GET请求后收到乱码响应,示例如下:

�\jj��T{�8��?�t(O�"V$�@��)���5�����~?��J�t"��   ��EEΕ7�b��,�u�i�=��k���3�ӡ�������m,��ꔁu�T낙*��{�DZ�l�`����{� ��M��+mB)��E{�UtG���ʘJ#ؠ�]j<u�?6�`h���.���𢚾�n��?�ʋ*��#%�w'<L��d�Ly����R�>���$�O�����—o�}�� �����v���{���?����r�;

相关代码

请求代码:

return webClient
                .get()
                .uri(URI.create(uri))
                .accept(MediaType.TEXT_HTML, MediaType.APPLICATION_XHTML_XML)
                .acceptCharset(StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1)
                .header("Accept-Encoding", "gzip, deflate, br")
                .retrieve()
                .bodyToMono(String.class);

WebClient配置:

HttpClient client = HttpClient.create()
                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectTimeout)
                .followRedirect(true)
                .secure()
                .responseTimeout(Duration.ofMillis(readTimeoutMillis));

        return WebClient.builder()
                .clientConnector(new ReactorClientHttpConnector(client))
                .build();

问题原因

你手动设置了Accept-Encoding头,告知服务端可返回gzip/deflate/br压缩后的响应,但未配置HttpClient自动解压这些压缩数据,导致原始压缩字节流被直接当作字符串解析,从而出现乱码。

解决方案

有两种处理方式,推荐第一种:

方式一:移除手动设置的Accept-Encoding头

Reactor HttpClient默认会自动处理响应压缩,它会自动添加合适的Accept-Encoding头,并在收到压缩响应时自动解压。只需删除请求代码中设置Accept-Encoding的那一行即可:

return webClient
                .get()
                .uri(URI.create(uri))
                .accept(MediaType.TEXT_HTML, MediaType.APPLICATION_XHTML_XML)
                .acceptCharset(StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1)
                .retrieve()
                .bodyToMono(String.class);

方式二:手动开启HttpClient的解压功能(不推荐)

如果一定要手动指定Accept-Encoding头,需要给HttpClient配置解压处理器,添加.decompress(true):

HttpClient client = HttpClient.create()
                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectTimeout)
                .followRedirect(true)
                .secure()
                .responseTimeout(Duration.ofMillis(readTimeoutMillis))
                .decompress(true); // 开启自动解压

        return WebClient.builder()
                .clientConnector(new ReactorClientHttpConnector(client))
                .build();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:15:31