解決restTemplate的各種調(diào)用問題

? ? ? ? ? ? ?最近在spring boot項(xiàng)目中REST接口的開發(fā)中使用restTemplate踩了一些坑堰汉,其實(shí)是自己對(duì)提交的各種方式有點(diǎn)混淆进栽,現(xiàn)在梳理出來供大家使用避免再次踩坑中狂。

? ? ? ? ? ? ?利用RestTemplate進(jìn)行接口測(cè)試是種常見的方法丁溅,但在使用過程中,由于其方法參數(shù)眾多义锥,很多同學(xué)又混淆了表單提交與Payload提交方式的差別柳沙,而且接口設(shè)計(jì)與傳統(tǒng)的瀏覽器使用的提交方式又有差異,經(jīng)常出現(xiàn)各種各樣的錯(cuò)誤拌倍,如405錯(cuò)誤赂鲤,或者根本就得不到提交的數(shù)據(jù)。


1. 用exchange方法提交

exchange既可以執(zhí)行POST方法贰拿,還可以執(zhí)行GET蛤袒,所以應(yīng)用最為廣泛,使用方法如下:

? ? ? String url ="http://localhost/mirana-ee/app/login";

? ? ? RestTemplate client =newRestTemplate();

? ? ? HttpHeaders headers =newHttpHeaders();//? 請(qǐng)勿輕易改變此提交方式膨更,大部分的情況下妙真,提交方式都是表單提交 ? ? ? ? headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);//? 封裝參數(shù),千萬(wàn)不要替換為Map與HashMap荚守,否則參數(shù)無法傳遞

? ? ?MultiValueMap params=newLinkedMultiValueMap();//? 也支持中文params.add("username","用戶名");

? ? ? params.add("password","123456");

? ? ?HttpEntity> requestEntity =newHttpEntity>(params, headers);//? 執(zhí)行HTTP請(qǐng)求

? ? ? ResponseEntity response = client.exchange(url, HttpMethod.POST, requestEntity, String.class);//? 輸出結(jié)果

? ? ? System.out.println(response.getBody());


2珍德、用postForEntity進(jìn)行提交

postForEntity是對(duì)exchange的簡(jiǎn)化练般,僅僅只需要減少HttpMethod.POST參數(shù),如下:

//? 上面的代碼完全一樣//? 僅需替換exchange方法

ResponseEntity response = client.postForEntity(url, requestEntity , String.class );


3. 關(guān)于表單提交與Payload提交的差異

在Controller的方法參數(shù)中锈候,如果將“@ModelAttribute”改為“@RequestBody”注解薄料,則此時(shí)的提交方式為Payload方式提交,詳細(xì)的差異請(qǐng)參見《 $.ajax使用總結(jié)(一):Form提交與Payload提交》泵琳,代碼示例如下:

//? 請(qǐng)注意@RequestBody注解

? ? @RequestMapping(value="/login", method=RequestMethod.POST, consumes="application/json")

? ? ? //? 千萬(wàn)不要畫蛇添足添加@ModelAttribute摄职,否則會(huì)被其覆蓋,如下

? ? ? ? //? public Account getAccount(@RequestBody@ModelAttribute Accountccount)

? ? ? ? ? ? ?publicAccountgetAccount(@RequestBody Account account) {? ?

? ? ? ? ? ? ? ? ? ? ? ? ? account.setVersion(newDate());

? ? ? ? ? ? ? ? ? ? ? ? ? ?return ? account;

? ? ? ? ? ? ? }

再次強(qiáng)調(diào)一次获列,千萬(wàn)不要畫蛇添足再次添加“@ModelAttribute”谷市,因?yàn)槠鋬?yōu)先級(jí)比較高,所以系統(tǒng)會(huì)采用表單方式解析提交內(nèi)容击孩。

對(duì)于Payload方式迫悠,提交的內(nèi)容一定要是String,且Header要設(shè)置為“application/json”巩梢,示例如下:

? ? ? //? 請(qǐng)求地址

? ? ?String url ="http://localhost/mirana-ee/app/login";RestTemplate client =newRestTemplate();

? ? ?//? 一定要設(shè)置header?

? ? ?HttpHeaders headers =newHttpHeaders();

? ? ?headers.setContentType(MediaType.APPLICATION_JSON_UTF8);

? ? ?//? 將提交的數(shù)據(jù)轉(zhuǎn)換為String

? ? ?//? 最好通過bean注入的方式獲取ObjectMapper

? ? ?ObjectMapper mapper =newObjectMapper();

? ? ?Map params= Maps.newHashMap();

? ? ? params.put("username","國(guó)米");

? ? ? params.put("password","123456");

? ? ? ?String value = mapper.writeValueAsString(params);

? ? ? ?HttpEntity requestEntity =newHttpEntity(value, headers);

? ? ? ?//? 執(zhí)行HTTP請(qǐng)求

? ? ? ?ResponseEntity response = client.postForEntity(url, requestEntity , String.class );

? ? ? ?System.out.println(response.getBody());

如果內(nèi)容不是以String方式提交创泄,那么一定會(huì)出現(xiàn)以下錯(cuò)誤:

Exceptioninthread"main"org.springframework.web.client.HttpClientErrorException:400Bad Request? ? at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:63)? ? at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700)? ? at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:653)? ? at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)? ? at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:407)



最后需要強(qiáng)調(diào)的是,通過@RequestBody是無法獲取到請(qǐng)求參數(shù)括蝠,如將上面服務(wù)端的代碼改為如下格式鞠抑,則肯定得不到數(shù)據(jù),但表單提交則相反又跛。


結(jié)論

RestTemplate能大幅簡(jiǎn)化了提交表單數(shù)據(jù)的難度碍拆,并且附帶了自動(dòng)轉(zhuǎn)換JSON數(shù)據(jù)的功能若治,但只有理解了HttpEntity的組成結(jié)構(gòu)(header與body)慨蓝,且理解了與uriVariables之間的差異,才能真正掌握其用法端幼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末礼烈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子婆跑,更是在濱河造成了極大的恐慌此熬,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滑进,死亡現(xiàn)場(chǎng)離奇詭異犀忱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扶关,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門阴汇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人节槐,你說我怎么就攤上這事搀庶」丈矗” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵哥倔,是天一觀的道長(zhǎng)秸架。 經(jīng)常有香客問我,道長(zhǎng)咆蒿,這世上最難降的妖魔是什么东抹? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮沃测,結(jié)果婚禮上府阀,老公的妹妹穿的比我還像新娘。我一直安慰自己芽突,他們只是感情好试浙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寞蚌,像睡著了一般田巴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挟秤,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天壹哺,我揣著相機(jī)與錄音,去河邊找鬼艘刚。 笑死管宵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的攀甚。 我是一名探鬼主播箩朴,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼秋度!你這毒婦竟也來了炸庞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤荚斯,失蹤者是張志新(化名)和其女友劉穎埠居,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體事期,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滥壕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兽泣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绎橘。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撞叨,靈堂內(nèi)的尸體忽然破棺而出金踪,到底是詐尸還是另有隱情浊洞,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布胡岔,位于F島的核電站法希,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏靶瘸。R本人自食惡果不足惜苫亦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望怨咪。 院中可真熱鬧屋剑,春花似錦、人聲如沸诗眨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)匠楚。三九已至巍膘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芋簿,已是汗流浹背峡懈。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留与斤,地道東北人肪康。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像撩穿,于是被迫代替她去往敵國(guó)和親磷支。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理冗锁,服務(wù)發(fā)現(xiàn)齐唆,斷路器,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • Spring的模型-視圖-控制器(MVC)框架是圍繞一個(gè)DispatcherServlet來設(shè)計(jì)的冻河,這個(gè)Servl...
    alexpdh閱讀 2,647評(píng)論 0 3
  • 1、@Controller 在SpringMVC 中茉帅,控制器Controller 負(fù)責(zé)處理由DispatcherS...
    圣光會(huì)制裁你丨閱讀 1,675評(píng)論 0 23
  • 啟用包掃描逐漸功能:<context:component-scan base-package="org.xxx.x...
    4ea0af17fd67閱讀 691評(píng)論 0 3
  • 首先題目存在文件包含漏洞 , 可以通過 : 讀取到目標(biāo)服務(wù)器源碼例如 : 可以看到 upload.php 的上傳的...
    王一航閱讀 1,976評(píng)論 2 11