RestTemplate Get请求如何实现bean参数传递
今天小编给大家分享一下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;@Slf4jpublic 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参数传递”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341