RestTemplate调用请求中文乱码解决办法
一、出现问题的原因二、解决办法一、出现问题的原因
RestTemplate在请求调用过程中,利用的HttpMessageConverter类来进行报文转换,以下是部分源码
而我们在HttpMessageConventer接口的抽象类AbstractHttpMessageConverter中发现有defaultCharset的字段,并存在set方法
/*** Set the default character set, if any. * @since 4.3*/public void setDefaultCharset(@Nullable Charset defaultCharset) {this.defaultCharset = defaultCharset;}
而我们最常用的就属StringHttpMessageConverter,该Converter默认的字符集是ISO8859-1, 所以在包含中文请求时会出现乱码问题
因此我们只需要更改默认字符集即可
二、解决办法
在项目中注入RestTemplate的地方获取到要修改的转换器,并设置中文字符集即可,如
@Bean("restTemplate")@ConditionalOnMissingBean(RestTemplate.class)public RestTemplate restTemplateHasNoLoadBalanced() {return createRestTemplate();}private RestTemplate createRestTemplate() {RestTemplate restTemplate = new RestTemplateBuilder().requestFactory(OkHttp3ClientHttpRequestFactory.class).setConnectTimeout(Duration.ofSeconds(5)).setReadTimeout(Duration.ofSeconds(30)).build();List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();Iterator<HttpMessageConverter<?>> iterator = converters.iterator();while (iterator.hasNext()) {HttpMessageConverter<?> converter = iterator.next();if (converter instanceof MappingJackson2XmlHttpMessageConverter){// 删除xml序列化,内部微服务之间用json交互iterator.remove();}else if (converter instanceof StringHttpMessageConverter){// 解决使用restTemplate中文乱码的问题((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);}}return restTemplate;}