RestTemplate调用请求中文乱码解决办法
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;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
