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
相关产品推荐
相关产品推荐

