解決RestTemplate 的getForEntity調(diào)用接口亂碼的問題
RestTemplate 的getForEntity調(diào)用接口亂碼
有時候,當我們在SpringBoot項目中使用restTemplate去調(diào)用第三方接口時,會發(fā)現(xiàn)返回的body中出現(xiàn)了亂碼,百度一搜,基本都說是需要將restTemplate中的消息轉(zhuǎn)換器中的StringHttpMessageConverter的字符編碼由iso8859-1改為utf-8 ,但是發(fā)現(xiàn)并不管用,那么還有一種可能是第三方接口的數(shù)據(jù)經(jīng)過GZIP壓縮過

默認情況下,restTemplate使用的是JDK的HTTP調(diào)用器,并不支持GZIP解壓,所以無法解析。
可以使用Apache 的HttpClient來解決,HttpClient其中內(nèi)置了對于GZIP的支持
具體做法如下:
- 引入pom坐標:
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.3</version> </dependency>
- 修改restTemplate配置:
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory()); //Apache Httpclient
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
return restTemplate;
}
此時重新使用restTemplate調(diào)用接口,發(fā)現(xiàn)數(shù)據(jù)已經(jīng)正常了。
RestTemplate返回值亂碼解決
一、在調(diào)用RestTemplate
的getForEntity(String url, Class responseType, Object… uriVariables)的接口時,返回中文字是亂碼的
二、我們來分析下原因:
1、查看RestTemplate的源碼發(fā)現(xiàn)

2、在構(gòu)造函數(shù)中,看到紅色圈出來的代碼了嗎,繼續(xù)點擊進去。

3、StringHttpMessageConvert這個類中的設(shè)置的編碼格式為GBK的編碼格式,即圖中的ISO-8859-1

三、接下來我們改寫代碼
在自己代碼里面獲取RestTemplate對象之后,加上一段代碼:

為了大家可以復(fù)制,我把代碼粘貼出來了,如下所示:
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> httpMessageConverters = restTemplate.getMessageConverters();
httpMessageConverters.stream().forEach(httpMessageConverter -> {
if(httpMessageConverter instanceof StringHttpMessageConverter){
StringHttpMessageConverter messageConverter = (StringHttpMessageConverter) httpMessageConverter;
messageConverter.setDefaultCharset(Charset.forName("UTF-8"));
}
});
//發(fā)送請求
String jsonStr = restTemplate.getForEntity(url, String.class).getBody();
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA2023.3.4開啟SpringBoot項目的熱部署(圖文)
本文使用的開發(fā)工具是idea,使用的是springboot框架開發(fā)的項目,配置熱部署,可以提高開發(fā)效率,文中通過圖文介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2024-02-02
淺析Java的Hibernate框架中的繼承關(guān)系設(shè)計
這篇文章主要介紹了Java的Hibernate框架中的繼承關(guān)系設(shè)計,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
jasypt SaltGenerator接口定義方法源碼解讀
這篇文章主要為大家介紹了jasypt SaltGenerator接口定義方法源碼解讀,,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
SpringBoot中配置多數(shù)據(jù)源的方法詳解
這篇文章主要為大家詳細介紹了SpringBoot中配置多數(shù)據(jù)源的方法的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-02-02

