RestTemplate中文亂碼Response問號

RestTemplate中文亂碼Response問號

背景描述

需要請求內(nèi)部restful接口路狮,那么有以下兩種方式可以選擇

  1. httpclient封裝請求
  • 優(yōu)點(diǎn) 最底層的實(shí)現(xiàn)方式,很直觀的能看到整個(gè)過程是如何實(shí)現(xiàn)的,也方便調(diào)優(yōu)耗拓,調(diào)參數(shù)等等操作簡單明了揣苏。
  • 缺點(diǎn) 代碼繁瑣涮因,大段大段的實(shí)現(xiàn),而且互相之間封裝的方式又千奇百怪施符。
  1. RestTemplate調(diào)用接口
  • 優(yōu)點(diǎn) 經(jīng)過模板模式封裝以后提供了簡潔明了的設(shè)計(jì)和通用的模板方法進(jìn)行調(diào)用,基本可以滿足絕大多數(shù)要求擂找,代碼優(yōu)美明了操刀,耦合度大幅度降低。
  • 缺點(diǎn) 學(xué)習(xí)成本相對方式一較大婴洼,封裝程度高難以調(diào)試和發(fā)現(xiàn)問題骨坑,容易擴(kuò)展但是需要很了解整個(gè)包如何使用。

問題現(xiàn)象

發(fā)送POST請求柬采,參數(shù)有中文有英文欢唾,返回的結(jié)果看起來除了中文亂碼是正常的。其中請求方法使用了模板方法的postForObject粉捻,直接返回字符串礁遣。中文亂碼表現(xiàn)為???
簡單的分析

  1. 出現(xiàn)問號的亂碼看起來并不是GBK UTF-8這種類型的編碼問題肩刃,否則會出現(xiàn)一堆奇怪的昆金卡考燙什么的而不是???祟霍。
  2. 請求其他人的接口返回中文正常請求這個(gè)接口返回亂碼杏头,說明可能原因有一部分在接口部分。
    谷歌百度了一天沸呐,大部分人都說的是StringHttpMessageConverter的原因醇王,RestTemplate會我們默認(rèn)注冊一系列Converter,其中包括一個(gè)StringHttpMessageConverter崭添,詳細(xì)的可以用搜索引擎搜索相關(guān)寓娩。他的默認(rèn)編碼確實(shí)是ISO-8859-1,這是spring-web寫死在代碼中的默認(rèn)值,但是修改了該值并不見效呼渣,返回結(jié)果沒有發(fā)生一點(diǎn)變化棘伴,而且也和分析1中的判斷有出入。翻閱一些人的文章和文檔后發(fā)現(xiàn)屁置,StringHttpMessageConverter本質(zhì)上是一個(gè)轉(zhuǎn)換請求的處理器焊夸,他是用來解決服務(wù)端接收到中文亂碼現(xiàn)象的解決方式,另外有處理器用來處理返回后的數(shù)據(jù)來轉(zhuǎn)換成文本或者實(shí)體蓝角,比如MappingJackson2HttpMessageConverter阱穗。RestTemplate提供很多處理器來處理返回文本的不同格式,比如text/html text/json text/plain帅容,正合了上述分析2中的第二點(diǎn)颇象,有的人接口默認(rèn)返回的格式剛好和MappingJackson2HttpMessageConverter默認(rèn)解析的格式一樣。

解決方式

上代碼

@Configuration
public class BeanConfig {

    @Bean(value = "rest")
    public RestTemplate getRestTemplateBuilder(){

        RestTemplate restTemplate = new RestTemplateBuilder()
                .setConnectTimeout(1000)
                .setReadTimeout(1000)
                .build();
        restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

        StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
        stringHttpMessageConverter.setWriteAcceptCharset(true);

        List<MediaType> mediaTypeList = new ArrayList<>();
        mediaTypeList.add(MediaType.ALL);

        for (int i = 0; i < restTemplate.getMessageConverters().size(); i++) {
            if (restTemplate.getMessageConverters().get(i) instanceof StringHttpMessageConverter) {
                restTemplate.getMessageConverters().remove(i);
                restTemplate.getMessageConverters().add(i, stringHttpMessageConverter);
            }
            if(restTemplate.getMessageConverters().get(i) instanceof MappingJackson2HttpMessageConverter){
                try{
                    ((MappingJackson2HttpMessageConverter) restTemplate.getMessageConverters().get(i)).setSupportedMediaTypes(mediaTypeList);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }

        return restTemplate;
    }


}

重點(diǎn)在于第一個(gè)處理器加上了修改了默認(rèn)編碼并徘,第二個(gè)處理添加了mediaTypeList.add(MediaType.ALL);解析所有返回?cái)?shù)據(jù)的格式遣钳。
本次的問題有別于網(wǎng)上所有跟這個(gè)問題相關(guān)的答案,但是真的花了我大半天的時(shí)間麦乞。主要還是對RestTemplate不熟悉的緣故蕴茴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市姐直,隨后出現(xiàn)的幾起案子倦淀,更是在濱河造成了極大的恐慌,老刑警劉巖声畏,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撞叽,死亡現(xiàn)場離奇詭異,居然都是意外死亡插龄,警方通過查閱死者的電腦和手機(jī)愿棋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來均牢,“玉大人糠雨,你說我怎么就攤上這事∨枪颍” “怎么了甘邀?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵琅攘,是天一觀的道長。 經(jīng)常有香客問我松邪,道長坞琴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任测摔,我火速辦了婚禮置济,結(jié)果婚禮上解恰,老公的妹妹穿的比我還像新娘锋八。我一直安慰自己,他們只是感情好护盈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布挟纱。 她就那樣靜靜地躺著,像睡著了一般腐宋。 火紅的嫁衣襯著肌膚如雪紊服。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天胸竞,我揣著相機(jī)與錄音欺嗤,去河邊找鬼。 笑死卫枝,一個(gè)胖子當(dāng)著我的面吹牛煎饼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播校赤,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吆玖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了马篮?” 一聲冷哼從身側(cè)響起沾乘,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浑测,沒想到半個(gè)月后翅阵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡迁央,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年掷匠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漱贱。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡槐雾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幅狮,到底是詐尸還是另有隱情募强,我是刑警寧澤株灸,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站擎值,受9級特大地震影響慌烧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸠儿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一屹蚊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧进每,春花似錦汹粤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贤徒,卻和暖如春芹壕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背接奈。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工踢涌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人序宦。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓睁壁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挨厚。 傳聞我的和親對象是個(gè)殘疾皇子堡僻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)疫剃,斷路器钉疫,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件巢价、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • String在Swift 4 的新特性深受大眾喜愛(至少我是很喜歡的).String API 在Swift 4 中...
    Lucky閃閃星閱讀 747評論 0 1
  • 臭凝閱讀 130評論 1 2
  • 01 “先撥入1,再撥入6碉克×杌#” 小手指,在算盤上撥入了1漏麦,再撥了橫梁上一個(gè)5.” “不對客税!" ...
    旦卉閱讀 386評論 6 1