RestTemplate Get請(qǐng)求實(shí)現(xiàn)bean參數(shù)傳遞詳解
項(xiàng)目場(chǎng)景
Spring 的 RestTemplate 是一個(gè)健壯的、流行的基于 Java 的 Http客戶(hù)端。
RestTemplate實(shí)現(xiàn)request param參數(shù)傳送,如果如下所示,直接傳一個(gè)map對(duì)象,調(diào)試之后是不會(huì)接收到參數(shù)的
Map<String,Object> param = new HashMap<String,Object>(); param.put("since",10); restTemplate.getForObject("https://api.github.com/users" , UserDto.class, param);
所以,正確的用法是使用占位符:
Map<String,Object> param = new HashMap<String,Object>(); param.put("since",10); restTemplate.getForObject("https://api.github.com/users?since={since}" , UserDto.class, param);
問(wèn)題描述
但是參數(shù)一多,我們每個(gè)都寫(xiě)占位符,那不是很麻煩,直接丟一個(gè)javabean不可以?直接丟個(gè)javabean,或者轉(zhuǎn)為map參數(shù)都不能直接傳過(guò)來(lái)
原因分析
通過(guò)查看RestTemplate源碼:org.springframework.web.client.RestTemplate#initUriTemplateHandler
DefaultUriBuilderFactory
是RestTemplateURL處理的工廠類(lèi),基層接口是UriTemplateHandler
,所以可以重新定義一下UriTemplateHandler
解決方案
下面介紹一種方法,可以重寫(xiě)UriTemplateHandler
接口,在RestTemplate源碼里找到這個(gè)接口是對(duì)接口參數(shù)進(jìn)行處理的
package com.example.resttemplate.configuration; import lombok.extern.slf4j.Slf4j; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.util.DefaultUriBuilderFactory; import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UriTemplateHandler; import java.net.URI; import java.util.Map; @Slf4j public class RestGetUriTemplateHandler implements UriTemplateHandler { private UriTemplateHandler uriTemplateHandler = new DefaultUriBuilderFactory(); @Override public URI expand(String uriTemplate, Map<String, ?> uriVariables) { // 使用UriComponentsBuilder 構(gòu)建請(qǐng)求的鏈接,也是拼參數(shù)的方法 UriComponentsBuilder builder = UriComponentsBuilder .fromHttpUrl(uriTemplate); for (Map.Entry<String, ?> entry : uriVariables.entrySet()) { builder.queryParam(entry.getKey(), entry.getValue()); } String uriString = builder.toUriString(); log.info("uriString:[{}]" , uriString); return uriTemplateHandler.expand(uriString , uriVariables); } @Override public URI expand(String uriTemplate, Object... uriVariables) { return uriTemplateHandler.expand(uriTemplate, uriVariables); } }
使用Hutool的工具類(lèi),轉(zhuǎn)換bean類(lèi)為map對(duì)象,import cn.hutool.core.bean.BeanUtil;
restTemplate.setUriTemplateHandler(new RestGetUriTemplateHandler()); Map<String,Object> param = BeanUtil.beanToMap(queryDto); restTemplate.getForObject("https://api.github.com/users/mojombo", UserDto.class , param);
也可以借助apache-commont的工具類(lèi)進(jìn)行轉(zhuǎn)換,import org.apache.commons.beanutils.BeanUtilsBean;
Map<String, String> paramMap = BeanUtilsBean.getInstance().describe(bean);
運(yùn)行之后,可以發(fā)現(xiàn)參數(shù)帶上去了,之后調(diào)第三方接口,直接傳個(gè)javabean就可以,方便很多,也可以對(duì)javabean轉(zhuǎn)map的操作進(jìn)行封裝,之后直接調(diào)用
到此這篇關(guān)于RestTemplate Get請(qǐng)求實(shí)現(xiàn)bean參數(shù)傳遞詳解的文章就介紹到這了,更多相關(guān)RestTemplate參數(shù)傳遞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 關(guān)于RestTemplate中的Get請(qǐng)求
- RestTemplate調(diào)用POST和GET請(qǐng)求示例詳解
- RestTemplate發(fā)送HTTP?GET請(qǐng)求使用方法詳解
- RestTemplate實(shí)現(xiàn)發(fā)送帶headers的GET請(qǐng)求
- spring boot RestTemplate 發(fā)送get請(qǐng)求的踩坑及解決
- 解決RestTemplate 的getForEntity調(diào)用接口亂碼的問(wèn)題
- RestTemplate發(fā)送get和post請(qǐng)求,下載文件的實(shí)例
- RestTemplate get請(qǐng)求攜帶headers自動(dòng)拼接參數(shù)方式
相關(guān)文章
Spring Boot與Kotlin處理Web表單提交的方法
本篇文章主要介紹了Spring Boot 與 Kotlin 處理Web表單提交的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01Shiro+Redis實(shí)現(xiàn)登錄次數(shù)凍結(jié)的示例
這篇文章主要介紹了Shiro+Redis實(shí)現(xiàn)登錄次數(shù)凍結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12解決Idea啟動(dòng)Spring Boot很慢的問(wèn)題
這篇文章主要介紹了解決Idea啟動(dòng)Spring Boot很慢的問(wèn)題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-12-12Spring創(chuàng)建Bean完成后執(zhí)行指定代碼的幾種實(shí)現(xiàn)方式
在實(shí)際開(kāi)發(fā)中經(jīng)常會(huì)遇到在spring容器加載完某個(gè)bean之后,需要執(zhí)行一些業(yè)務(wù)代碼的場(chǎng)景,本文給大家介紹Spring創(chuàng)建Bean完成后執(zhí)行指定代碼的幾種實(shí)現(xiàn)方式,感興趣的朋友一起看看吧2024-01-01