前言
当我们用String类型来接收RestTemplate请求结果时,我们会发现其中的中文变成了乱码,这是为什么呢?
原因
如果HTTP请求的结果返回的是字符串,那么RestTemplate就会用StringHttpMessageConverter转换器进行转换处理
因为 StringHttpMessageConverter 这个类默认编码不是UTF-8,而是ISO_8859_1,所以导致解析的结果中文乱码
源码如下:
/**
* The default charset used by the converter.
*/
public static final Charset DEFAULT_CHARSET = StandardCharsets.ISO_8859_1;
public StringHttpMessageConverter() {
this(DEFAULT_CHARSET);
}
解决办法
所以要解决中文乱码问题,只需要将编码改为UTF-8即可,这里我使用的是在注册RestTemplate的时候进行修改
@Bean
public RestTemplate restTemplate() {
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectionRequestTimeout(30 * 1000);
httpRequestFactory.setConnectTimeout(30 * 3000);
httpRequestFactory.setReadTimeout(30 * 3000);
RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
List<HttpMessageConverter<?>>httpMessageConverters = restTemplate.getMessageConverters();
httpMessageConverters.stream().forEach(httpMessageConverter -> {
if(httpMessageConverter instanceof StringHttpMessageConverter){
StringHttpMessageConverter messageConverter = (StringHttpMessageConverter) httpMessageConverter;
messageConverter.setDefaultCharset(Charset.forName("UTF-8"));
}
});
return restTemplate;
}
还可以添加多一个UTF_8的StringHttpMessageConverter转换器
@Bean
public RestTemplate restTemplate() {
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectionRequestTimeout(30 * 1000);
httpRequestFactory.setConnectTimeout(30 * 3000);
httpRequestFactory.setReadTimeout(30 * 3000);
RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
//spring转换默认编码是ISO_8859_1,如果乱码可修改支持中文编码
restTemplate.getMessageConverters().add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
return restTemplate;
}