首頁>技術>

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。

重啟應用,抓取網頁內容,亂碼問題解決!

8
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • IP4M,基於質譜代謝組學資料分析整合平臺