默認請求方式:
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也沒有問題
實際上下面的做法更規範:
源碼: