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;
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐