RestTemplate Get請求實現bean參數傳遞詳解
項目場景
Spring 的 RestTemplate 是一個健壯的、流行的基於 Java 的 Http客戶端。
RestTemplate實現request param參數傳送,如果如下所示,直接傳一個map對象,調試之後是不會接收到參數的
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);
問題描述
但是參數一多,我們每個都寫占位符,那不是很麻煩,直接丟一個javabean不可以?直接丟個javabean,或者轉為map參數都不能直接傳過來
原因分析
通過查看RestTemplate源碼:org.springframework.web.client.RestTemplate#initUriTemplateHandler
DefaultUriBuilderFactory
是RestTemplateURL處理的工廠類,基層接口是UriTemplateHandler
,所以可以重新定義一下UriTemplateHandler
解決方案
下面介紹一種方法,可以重寫UriTemplateHandler
接口,在RestTemplate源碼裡找到這個接口是對接口參數進行處理的
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 構建請求的鏈接,也是拼參數的方法 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的工具類,轉換bean類為map對象,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的工具類進行轉換,import org.apache.commons.beanutils.BeanUtilsBean;
Map<String, String> paramMap = BeanUtilsBean.getInstance().describe(bean);
運行之後,可以發現參數帶上去瞭,之後調第三方接口,直接傳個javabean就可以,方便很多,也可以對javabean轉map的操作進行封裝,之後直接調用
到此這篇關於RestTemplate Get請求實現bean參數傳遞詳解的文章就介紹到這瞭,更多相關RestTemplate參數傳遞內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 關於RestTemplate的使用深度解析
- 解決RestTemplate加@Autowired註入不瞭的問題
- RestTemplate實現發送帶headers的GET請求
- 解決RestTemplate 請求url中包含百分號 會被轉義成25的問題
- springboot restTemplate連接池整合方式