RestTemplate亂碼問題描述
RestTemplate是Spring-web提供的用於訪問Rest服務的客戶端,RestTemplate提供了多種便捷的訪問遠端Http服務的方法,能夠大大提高客戶端的編寫效率。RestTemplate預設依賴JDK提供http連線的能力(HttpURLConnection),在專案中會透過setRequestFactory方法或構造方法替換為例如 Apache HttpComponents、Netty或OkHttp等其它HTTP library,其中OkHttp的效能優越,使用較多。
在使用 restTemplate.getForEntity方法抓取網頁內容時發現返回的內容為亂碼,程式碼如下:
package com.pbteach.testimport com.alibaba.fastjson.JSON;import lombok.extern.slf4j.Slf4j;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.http.*;import org.springframework.test.context.junit4.SpringRunner;import org.springframework.util.LinkedMultiValueMap;import org.springframework.util.MultiValueMap;import org.springframework.web.client.RestTemplate;import java.util.Map;@SpringBootTest@RunWith(SpringRunner.class)@Slf4jpublic class RestTemplateTest { @Autowired RestTemplate restTemplate; //獲取網頁內容 @Test public void gethtml(){ //要抓取的網頁地址 String url = "http://www.pbteach.com/"; ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class); String body = forEntity.getBody(); System.out.println(body); } }
問題分析RestTemplate在訊息解析過程中有很多的訊息轉換器,跟蹤原始碼,如下:
當RestTemplate預設使用String儲存body內容時預設使用ISO_8859_1字符集,如果內容有中文則會亂碼。
問題解決配置StringHttpMessageConverter 訊息轉換器,使用utf-8字符集。
修改RestTemplate的定義方法
@Beanpublic RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(new OkHttp3ClientHttpRequestFactory()); //訊息轉換器列表 List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters(); //配置訊息轉換器StringHttpMessageConverter,並設定utf-8 messageConverters.set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));//支援中文字符集,預設ISO-8859-1,支援utf-8 return restTemplate;}
再次跟蹤原始碼,StringHttpMessageConverter使用的字符集為utf-8。
重啟應用,抓取網頁內容,亂碼問題解決!
最新評論