如下是一个正常的HTTP请求,返回信息中的中文是乱码
HttpHeaders httpHeaders = new HttpHeaders();
HttpEntity<Object> httpEntity = new HttpEntity<>(null, httpHeaders);
RestTemplate restTemplate = new RestTemplate();
String url = "https://www.baidu.com";
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
String body = responseEntity.getBody();
System.out.println(body);
解决方法
方法一
因为RestTemplate默认的String编码是ISO_8859_1,怎么得知默认编码的会在后面提到。可以重新使用utf-8解码一次
HttpHeaders httpHeaders = new HttpHeaders();
HttpEntity<Object> httpEntity = new HttpEntity<>(null, httpHeaders);
RestTemplate restTemplate = new RestTemplate();
String url = "https://www.baidu.com";
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
String body = responseEntity.getBody();
//使用utf-8重新解码
byte[] bytes = body.getBytes(StandardCharsets.ISO_8859_1);
body = new String(bytes, StandardCharsets.UTF_8);
System.out.println(body);
方法二
更换默认的StringHttpMessageConverterString转换器
HttpHeaders httpHeaders = new HttpHeaders();
HttpEntity<Object> httpEntity = new HttpEntity<>(null, httpHeaders);
//自定义转换器
ArrayList<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
StringHttpMessageConverter messageConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
messageConverters.add(messageConverter);
//使用自定义转换器初始化RestTemplate
RestTemplate restTemplate = new RestTemplate(messageConverters);
String url = "https://www.baidu.com";
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
System.out.println(responseEntity.getStatusCode());
String body = responseEntity.getBody();
System.out.println(body);
乱码原因
查看RestTemplate无参初始化,可以看到使用了一个无参的StringHttpMessageConverter

查看无参StringHttpMessageConverter


可以看到默认编码是

因此,解决办法就是重新编码、修改默认编码。
本文介绍了如何处理RESTTemplate中HTTP请求返回的中文乱码问题,提供了两种解决方案:一是通过重新编码已解码的字符串,二是替换默认的StringHttpMessageConverter。重点在于理解乱码产生的原因和适用的编码策略。
1万+

被折叠的 条评论
为什么被折叠?



