RestTemplate Get請求實現(xiàn)bean參數(shù)傳遞詳解
項目場景
Spring 的 RestTemplate 是一個健壯的、流行的基于 Java 的 Http客戶端。
RestTemplate實現(xiàn)request param參數(shù)傳送,如果如下所示,直接傳一個map對象,調(diào)試之后是不會接收到參數(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);
問題描述
但是參數(shù)一多,我們每個都寫占位符,那不是很麻煩,直接丟一個javabean不可以?直接丟個javabean,或者轉為map參數(shù)都不能直接傳過來

原因分析
通過查看RestTemplate源碼:org.springframework.web.client.RestTemplate#initUriTemplateHandler

DefaultUriBuilderFactory是RestTemplateURL處理的工廠類,基層接口是UriTemplateHandler,所以可以重新定義一下UriTemplateHandler
解決方案
下面介紹一種方法,可以重寫UriTemplateHandler 接口,在RestTemplate源碼里找到這個接口是對接口參數(shù)進行處理的
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 構建請求的鏈接,也是拼參數(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的工具類,轉換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);
運行之后,可以發(fā)現(xiàn)參數(shù)帶上去了,之后調(diào)第三方接口,直接傳個javabean就可以,方便很多,也可以對javabean轉map的操作進行封裝,之后直接調(diào)用

到此這篇關于RestTemplate Get請求實現(xiàn)bean參數(shù)傳遞詳解的文章就介紹到這了,更多相關RestTemplate參數(shù)傳遞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring Boot與Kotlin處理Web表單提交的方法
本篇文章主要介紹了Spring Boot 與 Kotlin 處理Web表單提交的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
Shiro+Redis實現(xiàn)登錄次數(shù)凍結的示例
這篇文章主要介紹了Shiro+Redis實現(xiàn)登錄次數(shù)凍結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
Spring創(chuàng)建Bean完成后執(zhí)行指定代碼的幾種實現(xiàn)方式
在實際開發(fā)中經(jīng)常會遇到在spring容器加載完某個bean之后,需要執(zhí)行一些業(yè)務代碼的場景,本文給大家介紹Spring創(chuàng)建Bean完成后執(zhí)行指定代碼的幾種實現(xiàn)方式,感興趣的朋友一起看看吧2024-01-01

