# RestTemplate中文乱码问题源码分析与解决

RestTemplate中文乱码问题源码分析与解决

--- 请求响应数据乱码源码原理分析

============================原理===================

//默认方式：

//RestTemplate restTemplate = new RestTemplate();

// 当返回的response-header的content-type属性有charset值时，

// restTemplate的 StringHttpMessageConverter会读取该charset值，并使用该值进行

//IO流 = 》字符串的转换，否则则使用默认的字符集

//

通过源码可以发现restTemplate底层默认使用了HttpURLConnection，可以支持其他多种http客户端,如httpclient、okhttp等，通过工厂方法模式创建请求：

restTemplate调用excute方法

restTemplate调用了doExecute方法

执行请求，调用ResponseExtractor responseExtractor.extractData()对相应结果进行数据提取

调用HttpMessageConverterExtractor this.delegate.extractData()执行抽取数据的操作

获取response-header的content-type，

判断消息转换器对应的支持媒体类型supportMediaType是否包含该content-type

调用第一个包含该content-type的GenericHttpMessageConverter转换数据读取数据

读取数据的时候会再一次获取response-header的content-type的字符集

如果该字符集存在，则使用该字符集进行 IO流 =》字符串 转换

案例

响应头中并没有content-type的header，照理说浏览器应该不知道服务端返回的输入流编码，如果和浏览器默认的编码不匹配应该会出现乱码，但是现在浏览器有编码自动识别功能，所以上面的代码没有加content-type的Header也没有问题

实际上下面的做法更规范：

源码：

============================原理=====================