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

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

 

 

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

//默认方式:

//RestTemplate restTemplate = new RestTemplate();

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

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

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

//

 

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

 

clipboard.png

 

clipboard.png

 

 

 

 

clipboard.png

 

 

                         restTemplate调用excute方法

clipboard.png

                         restTemplate调用了doExecute方法

clipboard.png

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

clipboard.png

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

clipboard.png

                         获取response-header的content-type,

clipboard.png

 

clipboard.png

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

clipboard.png

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

clipboard.png

 

clipboard.png

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

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

clipboard.png

 

clipboard.png

 

 

 

案例

 

clipboard.png

 

 

clipboard.png

 

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

 

         

clipboard.png

 

 

 

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

clipboard.png

源码:

clipboard.png

 

clipboard.png

 

clipboard.png

 

 

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

 

 

 

 

 

 

 

 

 

初探RestTemplate--解决中文乱码问题 - mryang125的博客 - CSDN博客.jpg