问题:
用restTemplate发送post请求,解析json数据,返回结果中文乱码。
String result = restTemplate.postForObject(restfulUrl, map, String.class);
解决:
方法一:使用FastJsonHttpMessageConverter,设置MediaType为application/json;charset=UTF-8,并放在converters中的第1位。
@Configuration
public class WebMvcConfig {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> converters= restTemplate.getMessageConverters();
List<MediaType> fastMediaTypes = new ArrayList<>();
// 处理中文乱码问题
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
fastConverter.setSupportedMediaTypes(fastMediaTypes);
converters.add(0, fastConverter);
return restTemplate;
}
}
方法二:
如果没有使用fastjson,可以设置StringHttpMessageConverter的MediaType为application/json;charset=UTF-8
@Configuration
public class WebMvcConfig {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
List<HttpMessageConverter<?>> converters= restTemplate.getMessageConverters();
List<MediaType> fastMediaTypes = new ArrayList<>();
// 处理中文乱码问题
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
stringConverter.setSupportedMediaTypes(fastMediaTypes);
restTemplate.getMessageConverters().set(1, stringConverter);
return restTemplate;
}
}
原因:
因为restTemplate默认加载了好几个消息转换器(converters),这里返回值类型是String,所以默认会使用StringHttpMessageConverter去处理,而StringHttpMessageConverter的媒体类型(MediaType)和字符集(charset)是text/plain 和ISO-8859-1,不符合要求,如下图。所以要设置下。