经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
RestTemplate Get请求实现bean参数传递详解
来源:jb51  时间:2022/11/19 17:12:59  对本文有异议

项目场景

Spring 的 RestTemplate 是一个健壮的、流行的基于 Java 的 Http客户端。

RestTemplate实现request param参数传送,如果如下所示,直接传一个map对象,调试之后是不会接收到参数的

  1. Map<String,Object> param = new HashMap<String,Object>();
  2. param.put("since",10);
  3. restTemplate.getForObject("https://api.github.com/users" , UserDto.class, param);

所以,正确的用法是使用占位符:

  1. Map<String,Object> param = new HashMap<String,Object>();
  2. param.put("since",10);
  3. 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源码里找到这个接口是对接口参数进行处理的

  1. package com.example.resttemplate.configuration;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.util.LinkedMultiValueMap;
  4. import org.springframework.util.MultiValueMap;
  5. import org.springframework.web.util.DefaultUriBuilderFactory;
  6. import org.springframework.web.util.UriComponentsBuilder;
  7. import org.springframework.web.util.UriTemplateHandler;
  8. import java.net.URI;
  9. import java.util.Map;
  10. @Slf4j
  11. public class RestGetUriTemplateHandler implements UriTemplateHandler {
  12. private UriTemplateHandler uriTemplateHandler = new DefaultUriBuilderFactory();
  13. @Override
  14. public URI expand(String uriTemplate, Map<String, ?> uriVariables) {
  15. // 使用UriComponentsBuilder 构建请求的链接,也是拼参数的方法
  16. UriComponentsBuilder builder = UriComponentsBuilder
  17. .fromHttpUrl(uriTemplate);
  18. for (Map.Entry<String, ?> entry : uriVariables.entrySet()) {
  19. builder.queryParam(entry.getKey(), entry.getValue());
  20. }
  21. String uriString = builder.toUriString();
  22. log.info("uriString:[{}]" , uriString);
  23. return uriTemplateHandler.expand(uriString , uriVariables);
  24. }
  25. @Override
  26. public URI expand(String uriTemplate, Object... uriVariables) {
  27. return uriTemplateHandler.expand(uriTemplate, uriVariables);
  28. }
  29. }

使用Hutool的工具类,转换bean类为map对象,import cn.hutool.core.bean.BeanUtil;

  1. restTemplate.setUriTemplateHandler(new RestGetUriTemplateHandler());
  2. Map<String,Object> param = BeanUtil.beanToMap(queryDto);
  3. restTemplate.getForObject("https://api.github.com/users/mojombo", UserDto.class , param);

也可以借助apache-commont的工具类进行转换,import org.apache.commons.beanutils.BeanUtilsBean;

  1. Map<String, String> paramMap = BeanUtilsBean.getInstance().describe(bean);

运行之后,可以发现参数带上去了,之后调第三方接口,直接传个javabean就可以,方便很多,也可以对javabean转map的操作进行封装,之后直接调用

到此这篇关于RestTemplate Get请求实现bean参数传递详解的文章就介绍到这了,更多相关RestTemplate参数传递内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号