RestTemplate Get请求实现bean参数传递详解

作者:smileNicky 时间:2022-03-14 22:20:27 

项目场景

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 Get请求实现bean参数传递详解

原因分析

通过查看RestTemplate源码:org.springframework.web.client.RestTemplate#initUriTemplateHandler

RestTemplate Get请求实现bean参数传递详解

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参数传递详解

来源:https://smilenicky.blog.csdn.net/article/details/126002964

标签:RestTemplate,Get,参数传递
0
投稿

猜你喜欢

  • C#入门教程之ListBox控件使用方法

    2023-09-20 04:52:59
  • 解析spring加载bean流程的方法

    2023-11-29 13:50:32
  • C# 装箱和拆箱的知识回顾

    2022-07-19 09:27:58
  • C#利用子线程刷新主线程分享教程

    2023-05-16 13:25:46
  • Eclipse开发环境导入android sdk的sample中的源码

    2021-06-08 05:28:38
  • springboot中自定义异常以及定制异常界面实现过程解析

    2023-05-13 09:14:00
  • C#利用FileSystemWatcher实时监控文件的增加,修改,重命名和删除

    2021-08-21 05:46:28
  • 比较2个datatable内容是否相同的方法

    2022-11-25 08:27:04
  • Java数组高级算法与Arrays类常见操作小结【排序、查找】

    2022-12-02 15:17:14
  • Android 中使用RadioGroup和Fragment实现底部导航栏的功能

    2022-07-17 16:11:04
  • mybatis根据表逆向自动化生成代码的实现

    2023-03-12 15:39:02
  • log4j配置失效日志中打印Debug信息问题

    2022-10-12 10:13:12
  • Android切面编程知识点详解

    2023-05-05 04:18:04
  • Android仿微信图片上传带加号且超过最大数隐藏功能

    2022-12-27 13:20:03
  • Java Struts图片上传至指定文件夹并显示图片功能

    2023-03-15 10:48:51
  • java操作excel表格详解

    2021-08-20 14:35:46
  • Java多线程之同步工具类Exchanger

    2022-07-05 03:50:54
  • Spring如何将bean添加到容器中

    2021-08-07 08:48:06
  • java String的intern方法

    2021-07-05 03:23:52
  • C#编程实现QQ界面的方法

    2023-02-05 23:35:45
  • asp之家 软件编程 m.aspxhome.com