RestTemplate中文乱码

当HTTP响应为application/octet-stream格式时,使用Spring RestTemplate收到字符串出现乱码。通过分析StringHttpMessageConverter的解码过程,文章介绍了如何配置和修改RestTemplate,成功解决了乱码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HTTP响应是 application/octet-stream 格式时,可以使用String去接收

String url = "xxxxx";
User user = new User();
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, user, String.class);
if (responseEntity.getStatusCodeValue() == 200) {
	String resultJson = responseEntity.getBody();
}

查看下结果,乱码了

在这里插入图片描述

贴一下RestTemplate的配置

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        return new RestTemplate(factory);
    }

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(15000);
        factory.setReadTimeout(30000);
        /**
         * factory.setBufferRequestBody(false);
         * 增加该配置后使用Transfer-Encoding:chunked的方式发包
         * 否则以Content-Length的方式发包
         */
        //factory.setBufferRequestBody(false);
        return factory;
    }
}

针对String的消息类型,spring使用的StringHttpMessageConverter类解码

public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {
    public static final Charset DEFAULT_CHARSET;
    @Nullable
    private volatile List<Charset> availableCharsets;
    private boolean writeAcceptCharset;

    public StringHttpMessageConverter() {
        this(DEFAULT_CHARSET);
    }

    public StringHttpMessageConverter(Charset defaultCharset) {
        super(defaultCharset, new MediaType[]{MediaType.TEXT_PLAIN, MediaType.ALL});
        this.writeAcceptCharset = true;
    }

    ...

    static {
        //默认为ISO-8859-1
        DEFAULT_CHARSET = StandardCharsets.ISO_8859_1;
    }
}

如何修改?

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        RestTemplate restTemplate = new RestTemplate(factory);
        List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
        for (HttpMessageConverter<?> messageConverter : messageConverters) {
            if (messageConverter instanceof StringHttpMessageConverter) {
                ((StringHttpMessageConverter) messageConverter).setDefaultCharset(StandardCharsets.UTF_8);
            }
        }
        return restTemplate;
    }

再次查看下结果 结果已正常

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值