RestTemplate請求數據中文亂碼源碼分析

2020-12-25 JAVA最新技術分享

默認請求方式:

RestTemplate restTemplate = new RestTemplate();

當返回的response-header的content-type屬性有charset值時,

restTemplate的 StringHttpMessageConverter會讀取該charset值,並使用該值進行IO流 =》字符串的轉換,否則則使用默認的字符集。

通過源碼可以發現restTemplate底層默認使用了HttpURLConnection,可以支持其他多種http客戶端,如httpclient、okhttp等,通過工廠方法模式創建請求:

restTemplate調用excute方法

2. restTemplate調用了doExecute方法

3. 執行請求,調用ResponseExtractor responseExtractor.extractData()對相應結果進行數據提取

4. 調用HttpMessageConverterExtractor this.delegate.extractData()執行抽取數據的操作

5. 獲取response-header的content-type,

6. 判斷消息轉換器對應的支持媒體類型supportMediaType是否包含該content-type

7. 調用第一個包含該content-type的GenericHttpMessageConverter轉換數據讀取數據

8.讀取數據的時候會再一次獲取response-header的content-type的字符集

如果該字符集存在,則使用該字符集進行 IO流 =》字符串 轉換

案例

響應頭中並沒有content-type的header,照理說瀏覽器應該不知道服務端返回的輸入流編碼,如果和瀏覽器默認的編碼不匹配應該會出現亂碼,但是現在瀏覽器有編碼自動識別功能,所以上面的代碼沒有加content-type的Header也沒有問題

實際上下面的做法更規範:

源碼:

相關焦點

  • SpringBoot圖文教程17—上手就會 RestTemplate 使用指南
    })publicclassBootResttemplateApplicationTests{@Autowiredprivate RestTemplate restTemplate;/*** 測試 * 參數2 響應數據的類型 是String 還是 Map等 必填項 * 參數3 請求攜帶參數 選填 * * getForObject 方法的返回值就是 被調用接口響應的數據 */
  • Spring Boot+Vue|axios異步請求數據的12種操作(上篇)
    Spring Boot + Vue 前後端分離最核心的操作就是通過異步請求完成數據同步,這其中又可以分為很多種不同的情況,比如是 GET 請求還是 POST
  • 怎麼設置tomcat在get請求的中文也不亂碼?兩種情況下配置
    我們都知道,get請求和post請求的一個比較顯著區別就是,在使用post請求的時候,中文不會亂碼,但是在使用get請求的時候,如果url後面帶有中文就會亂碼了。那麼這個怎麼解決呢?前提:配置項目的encoding編碼位utf-8的前提下。
  • JAVA 開發 SpringBoot RestTemplate自定義請求失敗異常處理
    一、異常現象在 JAVA 開發中我們經常會使用RestTemplate進行遠程接口調用,如果請求的接口出現異常:超時、服務不存在等等情況,這時響應狀態不是200,而是400、500等等狀態碼,這種情況下,程序便會拋出異常,如下:
  • 解決Redis 中文亂碼問題
    今天幫大家解決一個問題,昨晚雞排妹做Redis緩存的時候出現亂碼的問題。@Bean(name = "redisTemplate")public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, String> template
  • SPSS基礎:【09】數據文件亂碼解決辦法
    有時候,我們打開從其他人那裡或者網上下載的spss格式的數據文件會出現亂碼。為什麼會出現亂碼呢?如何解決亂碼問題呢?一、為什麼會出現亂碼?數據文件在存儲時,一般都有對應的編碼方式,我將它稱為存儲編碼。同樣SPSS軟體在打開數據時,也會用預先設置好的編碼方式去解析數據文件中的數據,此處的編碼我將它稱為打開編碼。如果存儲編碼和打開編碼不一致,那麼就有可能出現亂碼。為什麼說有可能,而不是一定會亂碼呢?
  • Springcloud序之Springboot2x模塊化+rest assured+AES加解密實現
    3.3.2、請求發送類AesTestController本類主要用來接收未加密的請求數據,使用AES加密後再通過rest-assured轉發給需要加密數據的接口。鑑於後面可能會實現一些複雜的校驗功能等,而rest-assured能較好滿足,故此處rest-assured。(其實也是可以使用其他可以發送http請求的一些框架或jar工具類或直接使用重定向代替)。
  • 在IDEA中使用RestTemplate方式進行微服務之間相互調用
    如下圖所示:12、刷新Eureka服務中心,此時可以看到有2個微服務註冊到服務中心了,如下圖所示:13、我們返回到微服務1的Controller類中修改方法,核心代碼如下:/*第一種寫法:直接使用RestTemplate,URL地址固定,需要事先知道對方微服務的IP位址,如果對方的微服務有多個IP位址的話(分布式),則局限性較大 */RestTemplate template
  • JavaWeb 亂碼問題終極解決方案!
    對於一些老司機而言,其實並不太容易遇到亂碼問題,但是對於一些新手來說,亂碼幾乎是家常便飯,而且每當亂碼時,網上搜了一大堆解決方案,發現自己的問題還是沒能解決,其實這就是平時研究代碼不求甚解導致的,亂碼問題,也要去分析,然後才能對症下藥,才能藥到病除。
  • 0576-6.1.0-Hive Comment中文亂碼補充
    作者:輝少Fayson 在前面的文章《Hive表欄位Comment中文亂碼》中,介紹了在Hive
  • 還在為Python中文亂碼煩惱,老司機給你講講!
    這裡需要提醒一點,有人在得到一份亂碼數據(str)後試圖先對其編碼(比如utf-8),再以另外一種方式解碼(比如GB2312),這樣肯定是行不通的,原因剛才我們已經講過——編碼解碼要一致,解決中文亂碼的正確環節應該在它出現之前。
  • 0754-5.16.2-Hive中使用Substr拆分含中文亂碼字符串報錯異常分析
    從上遊Oracle資料庫中導出的攜帶中文亂碼且編碼集為ISO-8859-1的數據文件,將導出的數據文件導入到Hive表,在原始表的基礎上通過創建視圖
  • 《廢品機械師》中文亂碼怎麼辦?中文亂碼修複方法介紹
    廢品機械師中文亂碼怎麼辦?
  • Go 語言應用之 template
    如果你完整看完了深度解密系列文章或者其他源碼相關文章的話,它甚至是比較簡單的。但這本書的優點是它包含的內容非常全,很適合複習。比如我們今天講的 template 相關的例子就來自於本書。在正式內容開始之前,來說點近期發生的事。
  • php中文亂碼問題的終極解決方案匯總
    在開始之前,我們先來談談為什麼會出現中文亂碼?閱讀文章前先來一套視頻教程,回復關鍵詞「320」領取很多新手朋友學習PHP的時候,發現程序中的中文在輸出的時候會出現亂碼的問題,那麼為什麼會出現這種亂碼的情況呢?
  • Matplotlib中文亂碼問題解決方案
    「你的問題,我來幫」本文轉自數據分析師(Python)優秀學員 Mr.喵的知乎文章摘要:Matplotlib
  • securecrt怎麼顯示中文?securecrt中文亂碼解決方法
    securecrt中文亂碼解決方法 發表於 2017-11-10 16:57:37   SecureCRT是一款支持SSH(SSH1和SSH2)的終端仿真程序,簡單地說是Windows下登錄UNIX
  • Hive表欄位Comment中文亂碼
    1.問題描述默認Hive中創建有中文注釋的表時,無論是在Hive CLI還是Hue中該注釋顯示都會是亂碼。注意Hive元數據這個資料庫應使用utf-8創建,如:create database metastore defaultcharacter set utf8;回到Hive中重現create一張表
  • mysql查詢資料庫導致中文亂碼
    mysql查詢資料庫,如果資料庫裡的欄位的值是中文,就會出現亂碼,怎麼解決呢?相應的代碼如下:<?php header("Content-Type:text/html; charset=utf-8");/***************查詢數據*******************/$con = mysql_connect("localhost","root","wancxh99");if (!
  • python筆記5-python2寫csv文件中文亂碼問題
    當list、tuple、dict裡面有中文時,列印出來的是Unicode編碼,這個是無解的。對中文編碼糾結的建議儘快換python3吧,python2且用且珍惜!一、csv中文亂碼1.open打開csv文件,用writer寫入帶有中文的數據時- writer寫入單行- writers寫入多行```# coding:utf-8import csvf = open("xieru.csv", 'wb')writer =