RestTemplate调用请求中文乱码解决办法
RestTemplate调用请求中文乱码解决办法一、出现问题的原因二、解决办法一、出现问题的原因RestTemplate在请求调用过程中,利用的HttpMessageConverter类来进行报文转换,以下是部分源码而我们在HttpMessageConventer接口的抽象类AbstractHttpMessageConverter中发现有defaultCharset的字段,并存在set方法/***
·
一、出现问题的原因
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;
}
更多推荐
已为社区贡献1条内容
所有评论(0)